2014-09-10 17 views
7

Solo una breve domanda su qualcosa che ho appena vissuto e sto ancora pensando perché:

mongos> db.tickets.count({ "idReferenceList" : { "$in" : [ { "$oid" : "53f1f09f2cdcc8f339e5efa2"} , { "$oid" : "5409ae2e2cdc31c5aa0ce0a5"}]}}); 
mongos> db.tickets.count({ "idReferenceList" : { "$in" : [ ObjectId("53f1f09f2cdcc8f339e5efa2") , ObjectId("5409ae2e2cdc31c5aa0ce0a5")]}}); 

Ho pensato che sia i formati di ortografia $ oid che di ObjectId erano esattamente gli stessi per MongoDB. Qualcuno sa perché con la prima query restituisce 0 risultati e con la seconda restituisce 2 (la risposta giusta)?

Inoltre, sto utilizzando il framework Morphia che utilizza il driver Java MongoDB per interagire con MongoDB. Mi sono reso conto che esiste un problema con la ricerca con $ a operatore in array objectIds su campi che non sono _ID eseguendo questo righe di codice:

List<ObjectId> fParams = new ArrayList<ObjectId>(); 

fParams.add(...); 

Query<Ticket> query = genericDAO.createQuery(); 

query.field("idReferenceList").in(fParams); 

result = genericDAO.find(query).asList(); 

Grazie mille in anticipo.

saluti,

  • Luis Cappa
+1

genericDAO.find (query) .asList(); // puoi farlo e controllare. ? Wjat è il filtro che stai usando in this.createQuery (filter), tra l'altro. – BatScream

+0

Siamo spiacenti, era solo un errore di battitura. Questo metodo 'createQuery' è un metodo interno che crea una query filtrando dall'elenco fParams. In poche parole, genericDAO.Find (this.createQuery (filter)) è lo stesso di genericDAO.find (query). Mi dispiace per quello – lcappa

risposta

3

Entrambi questi formati sono rappresentazioni validi di un id oggetto in MongoDB, secondo la documentazione,

http://docs.mongodb.org/manual/reference/mongodb-extended-json/

e che rappresentavano in modo diverso nelle due modalità,

Strict Mode   mongo Shell Mode 
    -----------   ---------------- 

    { "$oid": "<id>" } ObjectId("<id>") 

Quindi, per interrogare i campi che contengono objectid, dalla modalità shell/console, è necessario utilizzare ObjectId("<id>"). Qual è la sintassi da seguire nella modalità shell mongo.

Di qui la domanda:

db.tickets.count({ "idReferenceList" : { "$in" : [ ObjectId("53f1f09f2cdcc8f339e5efa2") , ObjectId("5409ae2e2cdc31c5aa0ce0a5")]}}); 

sarebbero tornati si conteggio delle righe.

Ora a farlo tramite l'API Java,

Hai bisogno di fare come qui sotto:

String[] ids = {"53f1f09f2cdcc8f339e5efa2","5409ae2e2cdc31c5aa0ce0a5"}; 
ObjectId[] objarray = new ObjectId[ids.length]; 

for(int i=0;i<ids.length;i++) 
{ 
    objarray[i] = new ObjectId(ids[i]); 
} 

BasicDBObject inQuery = new BasicDBObject("$in", objarray); 
BasicDBObject query = new BasicDBObject("idReferenceList", inQuery); 
DBCursor cursor = db.collection.find(query); 
while(cursor.hasNext()) 
{ 
    DBObject doc = cursor.next(); 
    // process the doc. 
} 
+0

Il fatto è che non sto interrogando al campo "_id", ma a "idReferenceList", che è un altro campo diverso definito con un tipo di campo di Array of objectIds. Come potete vedere, non funziona ... – lcappa

+0

la rappresentazione di un oggetto rimane la stessa indipendentemente dal campo in cui è presente. Aggiornerà la mia risposta. Ho appena dato un riferimento al campo _id. – BatScream

+0

Ma con la rappresentazione "$ oid" non funziona. L'hai provato? Basta salvare due documenti di prova tramite shell e provalo tu stesso. Il problema comunque è che sto usando il driver Java MongoDB e non riesco a scrivere da solo il formato di query "ObjectId". – lcappa

Problemi correlati