2015-05-05 17 views
5

Given zbiór tak: ..MongoDB: Jak znaleźć dokumentu przez id wewnątrz zagnieżdżonych dokumentu

[ 
    { 
    "_id" : ObjectId("5546329a470000850084a621"), 
    "name": "Joe", 
    "surname": "Smith", 
    "accounts": [ 
     { 
     "_id" : ObjectId("5546329a470000850084a655"), 
     "default": true, 
     "status" : "approved", 
     "activationTime" : ISODate("2013-05-03T14:37:15.025Z") 
     }, 
     { 
     "_id" : ObjectId("5546329a470000850084a688"), 
     "default": true, 
     "status" : "approved", 
     "activationTime" : ISODate("2014-06-03T14:37:15.025Z") 
     } 
    ] 
    }, 
    { 
    "_id" : ObjectId("9546329a470079850084a622"), 
    "name": "Jimmy", 
    "surname": "Brown", 
    "accounts": [ 
     { 
     "_id" : ObjectId("5546329a470790850084a651"), 
     "default": true, 
     "status" : "suspended", 
     "activationTime" : ISODate("2015-02-03T14:37:15.025Z") 
     }, 
     { 
     "_id" : ObjectId("5546329a470019850084a611"), 
     "default": true, 
     "status" : "approved", 
     "activationTime" : ISODate("2015-04-03T14:37:15.025Z") 
     } 
    ] 
    }, 
] 

... jak znajdę dokumentu przez accounts.N._id? Próbowałem to ...

db.users.find(
    {}, 
    { 
    "accounts": 0, "accounts": { 
     "$elemMatch": { "_id" : ObjectId("5546329a470019850084a611"), "default": true } 
    } 
    } 
) 

... ale to nie podlega programowi prac, ponieważ mam tylko _id wszystkich dokumentów:

{ "_id" : ObjectId("5546329a470000850084a621") } 
{ "_id" : ObjectId("9546329a470079850084a622") } 

jestem brakuje czegoś?

EDIT

Wynik że rzeczywiście potrzebne jest coś takiego:

{ 
    "_id" : ObjectId("9546329a470079850084a622"), 
    "name": "Jimmy", 
    "surname": "Brown" 
} 

Na przykład, muszę znaleźć przez accounts.N._id ale bez pokazywania samego dokumentu zagnieżdżony.

Odpowiedz

9

Zastosowanie dot notation:

Kiedy pole posiada wbudowany dokumentu, zapytanie może albo określić dokładne dopasowanie na dokumencie wbudowanego lub określić mecz przez poszczególnych pól w dokumencie osadzonego za pomocą notacji kropki .

db.coll.find({ 
    "accounts._id" :ObjectId("5546329a470019850084a611") 
}) 

Jeśli trzeba tylko wyjście część tablicy, gdzie masz swój _id trzeba użyć dollar in projection

pozycyjna $ operator ogranicza zawartość AA z wyników zapytania zawierać tylko pierwszy element pasujący do dokumentu zapytania .

i zapytanie będzie wyglądać następująco:

db.coll.find({ 
    "accounts._id" :ObjectId("5546329a470019850084a611") 
}, { 
    "accounts.$.": 1 
}) 

PS: jeśli trzeba wyjście jak w swoich zmodyfikowanych pytania, użyj tego:

db.coll.find({ 
    "accounts._id" :ObjectId("5546329a470019850084a611") 
}, { 
    accounts : 0 
}) 
+0

Dziękuję bardzo ... Nie chcę, aby pokazać zagnieżdżony dokument ... zobacz moją zaktualizowaną post. – j3d

+0

@ j3d zobacz moją zaktualizowaną odpowiedź –

1

Zastosowanie $elemMatch w kryteriach i używać $ operatora pozycyjną w projekcie, jak poniżej:

db.users.find({ 
    "accounts": { 
    "$elemMatch": { 
     "_id": ObjectId("5546329a470019850084a611"), 
     "default": true 
    } 
    } 
}, { 
    "accounts.$._id": 1 // "accounts.$": 1 also works 
}).pretty() 
4

Operator $ elemMatch ogranicza zawartość pola z wyników zapytania, aby zawierał tylko pierwszy element pasujący do warunku $ elemMatch.

W twoim przypadku:

db.users.find({'_id': ObjectId('5546329a470000850084a621')}, {accounts: {$elemMatch: {_id: ObjectId('5546329a470000850084a655')}}}) 

Patrz: Mongo Docs

+0

jak to się różni od odpowiedzi udzielonych 10 minut przed tym? –

+0

Zawiera przykład z opisem i linkami do tej strony i słownika. Tak więc osoba, która zadała to pytanie, może zapoznać się z innymi terminami MongoDB. –

+0

, które są również dostępne w odpowiedziach –

Powiązane problemy