2010-10-07 3 views
8

J'essaie d'utiliser MongoDB avec MATLAB. Bien qu'il n'y ait pas de supported driver pour MATLAB, il y en a un pour Java. Heureusement j'ai été capable de l'utiliser pour se connecter à db, etc. I downloaded la dernière version (2.1) du fichier jar et l'installer avec JAVAADDPATH. Puis j'ai essayé de suivre le Java tutorial.Connexion à MongoDB à partir de MATLAB

Voici le code

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

Voici où j'empilée. coll censé être objet DBCollection, mais en fait est l'objet de la classe com.mongodb.DBApiLayer$MyCollection. Ainsi, la dernière commande renvoie l'erreur:

??? Aucune méthode 'insert' avec la signature correspondante trouvée pour la classe 'com.mongodb.DBApiLayer $ MyCollection'.

Dans le didacticiel la variable coll est créé explicitement comme objet DBCollection:

DBCollection coll = db.getCollection("testCollection") 

que je fais quelque chose de mal dans Matlab? Des idées?

Une autre petite question sur la variable colls. C'est la classe com.mongodb.util.OrderedSet et contient la liste des noms de toutes les collections dans la base de données. Comment pourrais-je le convertir en matrice de cellules MATLAB?


Mise à jour: En plus de Amro's answer cela fonctionne ainsi:

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

Répondre

10

Une vérification rapide:

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

montre qu'il attend un tableau:

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

Essayez ceci:

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

Remarque: Si vous utilisez Java dans MATLAB, je vous suggère d'utiliser les utilitaires CheckClass et UIInspect par Yair Altman

+1

+1. La méthode attend un tableau (ou plutôt un vararg). Depuis Java5, il y a maintenant varargs, donc depuis Java vous pouvez l'appeler directement avec le DBObject. Est-ce que cela signifie que les varargs ne sont pas supportés dans les liaisons Java MATLAB? – Thilo

+0

Si je me souviens, Java Varargs sont simplement sucre syntaxique pour la construction de la matrice – Amro

+0

Réponse très utile. Merci beaucoup. Je ne suis pas si expérimenté avec Java dans MATLAB mais j'apprends. – yuk

2

Pour la petite question sur la conversion de la liste des collections utilisent la méthode toArray().

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

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

Merci! Fonctionne très bien. – yuk

3

Il existe maintenant un pilote spécialement conçu pour connecter MongoDB et Matlab. Il est construit sur le dessus du mongo-c-driver. Source se trouve sur github:

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

+0

Intéressant. Je vais essayer. Merci. – yuk

+0

Cela ne semble pas compiler sur Mac OS, et semble avoir été abandonné (ou du moins n'est certainement pas en cours de développement/supporté) ... – GarlicFries

+0

Méfiez-vous de cela. Je passe plusieurs heures à essayer de lier dans tous les fichiers externes en recherchant constamment toutes les erreurs que je recevais et cela ne fonctionnait toujours pas. L'auteur fournit environ deux lignes vagues sur la façon dont nous sommes supposés mettre en œuvre ceci. – Leon

Questions connexes