2012-02-08 16 views
7

Dato l'esempio doc di seguito:MongoDB selezionare campo per tornare documento incorporato in serie

{ 
    "_id" : "2", 
    "objects" : [{ 
     "_id" : "1", 
     "name" : "embedded " 
    },{ 
     "_id" : "2", 
     "name" : "embedded " 
    },{ 
     "_id" : "3", 
     "name" : "embedded " 
    }], 
    "name" : "gloss2" 
} 

E 'possibile restituire solo un documento secondario? In questo modo non devo selezionare l'intero oggetto genitore, ottenere l'elenco e scorrere l'elenco per ottenere l'oggetto in questione.

{ 
    "_id" : "2", 
    "name" : "embedded" 
} 

risposta

14

È possibile restituire solo un documento secondario?

Sì, ma non nel modo desiderato. Se fate quanto segue, si otterrà solo indietro il primo elemento della matrice:

coll.find({_id:'2'}, { 'objects.0': 1}) 

Tuttavia, ciò che si vuole veramente è qualcosa che è simile al seguente:

coll.find({_id:'2', 'objects._id': '3'}, { 'objects.$' : 1}) 

Naturalmente, che in realtà non funziona in MongoDB.

Guardando a your other question, questo è uno dei motivi per utilizzare "l'oggetto incorporato" invece della "matrice di oggetti". Con "oggetto incorporato" è possibile effettuare le seguenti operazioni:

coll.find({_id:'2'}, {'objects.3': 1}) // where 3 is the id of the third object 

Ciò consente di scegliere solo gli "oggetti incorporati" necessari.

In questo modo non devo selezionare l'intero oggetto genitore ...

La cosa con MongoDB è che il documento genitore è sempre inverosimile. Le query restituiscono documenti di livello superiore. Questo è cotto nell'intera architettura. Anche se richiedi solo una porzione del documento, il server deve comunque caricare l'intero documento in memoria prima di fornirti il ​​pezzo richiesto.

L'unico modo per aggirare questo può essere il nuovo Aggregation Framework, ma che non è ancora nel ramo stabile.

+0

Grande, grazie per la spiegazione. –

2

È possibile restituire un documento secondario, ma non è possibile restituire un elemento da un array. Scusate.

0

Mongodb 3.2 introduce $ elemMatch con che è possibile ottenere solo un primo documento con corrispondenza dalla serie di documenti.

db.sample.find({_id:"2"},{objects:{$elemMatch:{_id:"2"}}}) 
Problemi correlati