2015-05-05 15 views
5

Gegeben zu finden: ..MongoDB: Wie eine Sammlung wie diese ein Dokument durch eine ID innerhalb eines verschachtelten Dokuments

[ 
    { 
    "_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") 
     } 
    ] 
    }, 
] 

... wie kann ich ein Dokument von accounts.N._id finden? Ich habe schon versucht, diese ...

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

... aber es does't Arbeit, da ich nur die _id aller Dokumente erhalten:

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

Bin ich etwas fehlt?

EDIT

Das Ergebnis, das ich tatsächlich so etwas wie dieses brauchen, ist:

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

Zum Beispiel, ich brauche von accounts.N._id zu finden, aber ohne das verschachtelte Dokument zeigt sich.

Antwort

9

Verwendung dot notation:

Wenn das Feld ein eingebettetes Dokument hält, kann eine Abfrage entweder angeben eine genaue Übereinstimmung auf dem eingebetteten Dokument oder ein Spiel von einzelne Felder im eingebetteten Dokument geben Sie die Punktnotation .

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

Wenn Sie nur den Teil eines Arrays ausgeben, wo Sie Ihre _id haben Sie dollar in projection

Die Positions $ Operator begrenzt den Inhalt eines von den Abfrageergebnisse verwenden müssen um nur das erste Element zu enthalten, das der Abfrage Dokument entspricht.

und Ihre Abfrage würde wie folgt aussehen:

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

P. S., wenn Sie die Ausgabe wie in Ihren geändertenen Fragen benötigen, verwenden Sie diese:

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

Thank you very much ... Ich will nicht das verschachtelte Dokument zeigen ... meine aktualisierte Post sehen. – j3d

+0

@ j3d sehe meine aktualisierte Antwort –

1

Verwenden $elemMatch in Kriterien und wie unten $ Positions Operator in Projekt verwenden:

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

Die $ elemMatch Betreiber begrenzt den Inhalt eines Feldes aus den Abfrageergebnissen, um nur das erste Element zu enthalten, das der $ elemMatch-Bedingung entspricht.

In Ihrem Fall:

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

Siehe: Mongo Docs

+0

Wie unterscheidet es sich von den Antworten 10 Minuten vor diesem gegeben? –

+0

Es enthält Beispiel mit Beschreibung und Links zu dieser Seite und Glossar. Also, diese Person, die diese Frage gestellt hat, kann andere MongoDB-Terminologien sehen. –

+0

, die in den Antworten auch verfügbar sind –

Verwandte Themen