2010-10-07 18 views
8

Estoy tratando de usar MongoDB con MATLAB. Aunque no hay supported driver para MATLAB, hay uno para Java. Afortunadamente, pude usarlo para conectarme a db, etc. I downloaded la versión más reciente (2.1) del archivo jar e instalarlo con JAVAADDPATH. Entonces traté de seguir el Java tutorial.Conectando a MongoDB desde MATLAB

Este es el código

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

Aquí es donde Apilé. coll se supone que es DBCollection objeto, pero en realidad es objeto de la clase com.mongodb.DBApiLayer$MyCollection. Entonces el último comando devuelve el error:

??? Ningún método 'insert' con la coincidencia de la firma encontrada para la clase 'com.mongodb.DBApiLayer $ MyCollection'.

En el tutorial de la variable coll se crea explícitamente como objeto DBCollection:

DBCollection coll = db.getCollection("testCollection") 

¿Estoy haciendo algo mal en MATLAB? ¿Algunas ideas?

Otra pregunta menor acerca de la variable colls. Es la clase com.mongodb.util.OrderedSet y contiene la lista de nombres de todas las colecciones en el db. ¿Cómo podría convertirlo a la matriz de células de MATLAB?


actualización: Además de Amro's answer esto funciona así:

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

Respuesta

10

Una revisión rápida:

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

muestra que se espera una matriz:

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

Tal vez puedas probar:

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

Nota: Si está utilizando Java en MATLAB, le sugiero que utilice los CheckClass y UIInspect utilidades por Yair Altman

+1

+1. El método espera una matriz (o más bien una vararg). Desde Java5, ahora hay varargs, por lo que desde Java puede llamarlo directamente con DBObject. ¿Esto significa que no se admiten varargs en los enlaces Java de MATLAB? – Thilo

+0

Como recuerdo, los varargs de Java son simplemente azúcar sintáctico para la construcción de matriz – Amro

+0

Respuesta muy útil. Muchas gracias. No tengo tanta experiencia con Java en MATLAB, pero estoy aprendiendo. – yuk

2

Para la cuestión de menor importancia sobre la conversión de la lista de las colecciones usan el método toArray().

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

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

¡Gracias! Funciona genial. – yuk

3

Ahora hay un controlador creado expresamente para conectar MongoDB y Matlab. Está construido sobre el controlador mongo-c. La fuente se puede encontrar en github:

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

+0

Interesante. Voy a darle una oportunidad. Gracias. – yuk

+0

Parece que esto no se compila en Mac OS, y parece que se ha abandonado (o al menos ciertamente no se está desarrollando/apoyando activamente) ... – GarlicFries

+0

Tenga cuidado con esto. Pasé varias horas intentando vincular todos los archivos externos buscando constantemente todos los errores que estaba obteniendo y aún no funcionó. El autor proporciona aproximadamente dos líneas vagas sobre cómo se supone que debemos implementar esto. – Leon