2010-10-07 20 views
8

Sto provando a utilizzare MongoDB con MATLAB. Sebbene non ci sia supported driver per MATLAB, ce n'è uno per Java. Fortunatamente sono stato in grado di usarlo per connettermi a db, ecc. I downloaded l'ultima versione (2.1) di jar-file e installarlo con JAVAADDPATH. Quindi ho provato a seguire lo Java tutorial.Connessione a MongoDB da MATLAB

Ecco il codice

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); 

Qui è dove ho impilati. coll dovrebbe essere l'oggetto DBCollection, ma in realtà è l'oggetto della classe com.mongodb.DBApiLayer$MyCollection. Quindi l'ultimo comando restituisce l'errore:

??? Nessun metodo 'inserisci' con la firma corrispondente trovata per la classe 'com.mongodb.DBApiLayer $ MyCollection'.

Nel tutorial la variabile coll si crea esplicitamente come oggetto DBCollection:

DBCollection coll = db.getCollection("testCollection") 

sto facendo qualcosa di sbagliato in MATLAB? Qualche idea?

Un'altra piccola domanda relativa alla variabile colls. È la classe com.mongodb.util.OrderedSet e contiene l'elenco dei nomi di tutte le raccolte nel db. Come posso convertirlo nell'array di celle MATLAB?


Aggiornamento: Oltre a Amro's answer questo funziona così:

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

risposta

10

Un rapido controllo:

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

mostra che si aspetta un array:

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

Prova a modificare:

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

Nota: Se si utilizza Java in MATLAB, vi suggerisco di utilizzare i CheckClass e UIInspect utilità da Yair Altman

+1

+1. Il metodo si aspetta un array (o piuttosto un vararg). Dal momento che Java5 ora ci sono vararg, quindi da Java puoi chiamarlo direttamente con DBObject. Questo significa che i vararg non sono supportati nei collegamenti Java MATLAB? – Thilo

+0

Come ricordo, le varargs Java sono semplicemente zucchero sintattico per il costrutto dell'array – Amro

+0

Risposta molto utile. Molte grazie. Non sono così esperto con Java in MATLAB ma sto imparando. – yuk

2

Per la domanda minore sulla conversione l'elenco dei le raccolte utilizzano il metodo toArray().

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

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

Grazie! Funziona alla grande. – yuk

3

Ora è stato creato un driver appositamente per collegare MongoDB e Matlab. È costruito sopra il mongo-c-driver. Fonte può essere trovato su github:

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

+0

Interessante. Farò un tentativo. Grazie. – yuk

+0

Questo non sembra essere compilato su Mac OS, e sembra essere stato abbandonato (o almeno certamente non è attivamente sviluppato/supportato) ... – GarlicFries

+0

Attenzione a questo. Trascorro diverse ore cercando di collegare tutti i file esterni cercando costantemente su google tutti gli errori che stavo ottenendo e ancora non funzionava. L'autore fornisce due linee vaghe su come si dovrebbe implementare questo. – Leon