2016-12-07 4 views
0

abzufragen, wie die spezifische Nachricht von _id erhalten. Ich habe eine Datenbank-Schema wie folgt:MongoDB: Wie Feld Array von _id

{ 
    "_id": ObjectID("5846eedaf0b51ed02ed846e2"), 
    "name": "conversation name" 
    "messages": [ 
     { 
      "_id": ObjectID("584820a96866b6283361a4b9"), 
      "content": "hello", 
      "status": 0, 
      "type": 0 
     }, 
     { 
      "_id": ObjectID("584820d56866b6283361a4ba"), 
      "content": "voices/1481122005696.mp3", 
      "status": 0, 
      "type": 3 
     } 
    ] 
} 
+0

Mögliche Duplikat [MongoDB Abfrage mit elemMatch für verschachtelte Array-Daten] (http://stackoverflow.com/questions/20525754/mongodb-query-with-lemammatch-for-nested-array-data) – Yogesh

Antwort

1
db.collection.find({}, { 
    'messages': { 
     $elemMatch: { 
      '_id': ObjectId("584820a96866b6283361a4b9") 
     } 
    } 
}) 

Dies wird in Ihrer Sammlung auf allen Dokumenten übereinstimmen, und gibt die passenden Array-Unterfeld in der Projektion. Siehe den Link in Yogeshs Kommentar.

1

Da Sie Mungo getaggt, ich habe es so, aber die Abfragesyntax ist gültig, weil ein Teil der mongoDB Abfragesyntax ist:

Conversation.findOne({ 
    "messages._id": "584820a96866b6283361a4b9" 
}, function(err, document){ 
    if (err) { 
     console.log(err) 
     return 
    } 
    var message = document.messages.id("584820a96866b6283361a4b9") 
}) 

Die finOne() method wird wieder die volle Eltern-Dokument mit allen Nachrichten (Subdokumente) und andere Eigenschaften. Sie müssen dann das Filialdokument ausfiltern. Mongoose bietet eine Möglichkeit, dies zu tun, einfach mit: document.messages.id("584820a96866b6283361a4b9") wo Dokument das Datenobjekt an den Fund Rückruf übergeben würde

See: Spiel ein Feld ohne Array-Index Festlegen auf https://docs.mongodb.com/v3.2/tutorial/query-documents/#query-on-arrays