2012-02-08 14 views
7

Zważywszy na przykład doc poniżej:MongoDB Wybierz pole, aby powrócić dokument osadzony w tablicy

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

Czy to możliwe, aby powrócić tylko jeden dokument podrzędny? W ten sposób nie muszę wybierać całego obiektu nadrzędnego, pobierać listy i przeglądać listę, aby uzyskać dany obiekt.

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

Odpowiedz

14

Czy możliwe jest zwrócenie tylko jednego poddokumentu?

Tak, ale nie tak, jak chcesz. Jeśli wykonaj następujące czynności, będzie można dostać tylko z powrotem do pierwszego elementu tablicy:

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

Jednak to, co naprawdę chcesz to coś, co wygląda następująco:

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

oczywiście, że w rzeczywistości nie działa w MongoDB.

Patrząc na your other question, jest to jeden z powodów używania "obiektu osadzonego" zamiast "tablicy obiektów". Z „osadzony obiekt” można wykonać następujące czynności:

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

pozwala to wybrać tylko „osadzone obiekty” trzeba.

ten sposób nie mam, aby zaznaczyć cały obiekt nadrzędny ...

Rzecz z MongoDB jest to, że dokument nadrzędny jest zawsze naciągane. Zapytania zwracają dokumenty najwyższego poziomu. To jest wypiekane w całej architekturze. Nawet jeśli zażądasz tylko kawałka dokumentu, serwer nadal musi załadować cały dokument do pamięci przed podaniem żądanego fragmentu.

Jedynym sposobem obejścia tego może być nowa Aggregation Framework, ale nie jest to jeszcze gałąź stabilna.

+0

Świetnie, dzięki za wyjaśnienie. –

2

Możesz powrócić jeden dokument podrzędny, ale nie można powrócić jeden element z tablicy. Przepraszam.

0

MongoDB 3.2 wprowadza $ elemMatch z których można uzyskać tylko jeden pierwszy pasujący dokument z tablicy dokumentów.

db.sample.find({_id:"2"},{objects:{$elemMatch:{_id:"2"}}}) 
Powiązane problemy