2010-10-07 6 views
8

Próbuję użyć MongoDB z MATLAB. Chociaż dla MATLAB nie ma wersji supported driver, jest jedna dla Javy. Na szczęście udało mi się go użyć do połączenia z bazą danych, itp. I downloaded najnowszą (2.1) wersją pliku jar i zainstalować ją za pomocą JAVAADDPATH. Potem próbowałem podążać za Java tutorial.Podłączanie do MongoDB z MATLAB

Oto kod

javaaddpath('c:\MATLAB\myJavaClasses\mongo-2.1.jar') 

import com.mongodb.Mongo; 
import com.mongodb.DB; 
import com.mongodb.DBCollection; 
import com.mongodb.BasicDBObject; 
import com.mongodb.DBObject; 
import com.mongodb.DBCursor; 

m = Mongo(); % connect to local db 
db = m.getDB('test'); % get db object 
colls = db.getCollectionNames(); % get collection names 
coll = db.getCollection('things'); % get DBCollection object 

doc = BasicDBObject(); 
doc.put('name', 'MongoDB'); 
doc.put('type', 'database'); 
doc.put('count', 1); 
info = BasicDBObject(); 
info.put('x', 203); 
info.put('y', 102); 
doc.put('info', info); 
coll.insert(doc); 

Oto gdzie ułożone. coll ma być obiektem DBCollection, ale w rzeczywistości jest obiektem klasy com.mongodb.DBApiLayer$MyCollection. Tak więc ostatnie polecenie zwraca błąd:

??? Nie znaleziono metody "wstaw" z pasującym podpisem dla klasy "com.mongodb.DBApiLayer $ MyCollection".

W tutorialu zmienna coll tworzony jest wyraźnie jako przedmiot DBCollection:

DBCollection coll = db.getCollection("testCollection") 

Czy robię coś źle w MATLAB-ie? Jakieś pomysły?

Kolejne niewielkie pytanie dotyczące zmiennej colls. Jest to klasa com.mongodb.util.OrderedSet i zawiera listę nazw wszystkich kolekcji w bazie danych. Jak mogę go przekonwertować na macierz komórek MATLAB?


Aktualizacja: Oprócz Amro's answer ten działa tak samo:

wc = com.mongodb.WriteConcern(); 
coll.insert(doc,wc) 

Odpowiedz

10

Szybkie sprawdzenie:

methodsview(coll)  %# or: methods(coll, '-full') 

pokazuje, że oczekuje tablicy:

com.mongodb.WriteResult insert(com.mongodb.DBObject[]) 

Spróbuj to zamiast:

doc(1) = BasicDBObject(); 
doc(1).put('name', 'MongoDB'); 
doc(1).put('type', 'database'); 
... 
coll.insert(doc); 

Uwaga: Jeśli używasz Java w programie MATLAB, proponuję użyć CheckClass i UIInspect narzędzi przez Yair Altman

+1

+1. Metoda oczekuje tablicy (a raczej vararg). Od wersji Java5 istnieją już warianty, więc z poziomu Java możesz po prostu wywołać je bezpośrednio z DBObject. Czy to oznacza, że ​​varargs nie są obsługiwane w powiązaniach Java MATLAB? – Thilo

+0

Jak pamiętam, Java varargs są po prostu syntaktycznym cukrem dla konstruktu tablicowego – Amro

+0

Bardzo przydatna odpowiedź. Wielkie dzięki. Nie mam tak dużego doświadczenia z Javą w MATLAB, ale uczeniem się. – yuk

2

za małoletniego pytanie o konwersję listę Kolekcje korzystają z metody toArray().

>> cList=cell(colls.toArray()) 

cList = 
    'foo' 
    'system.indexes' 
    'things' 
+0

Dzięki! Działa świetnie. – yuk

3

Jest teraz sterownik zbudowany bezpośrednio w celu połączenia MongoDB i Matlab. Jest zbudowany na szczycie sterownika mongo-c. Źródło można znaleźć na github:

https://github.com/gerald-lindsly/mongo-matlab-driver

+0

Interesujące. Spróbuję. Dzięki. – yuk

+0

To nie wydaje się kompilować w systemie Mac OS i wydaje się, że zostało porzucone (lub przynajmniej na pewno nie jest aktywnie rozwijane/obsługiwane) ... – GarlicFries

+0

Strzeż się tego. Spędziłem kilka godzin próbując połączyć wszystkie pliki zewnętrzne przez ciągłe szukanie wszystkich błędów, które otrzymywałem i nadal nie działało. Autor podaje dwa niejasne wskazówki na temat tego, w jaki sposób ma to zaimplementować. – Leon