2016-06-20 7 views
0

Ich habe eine Sammlung erstellt, die Untersammlungsdaten enthält. Ich möchte aus der Untersammlung mit einem Schlüssel filtern.Wie bekomme ich ein untergeordnetes Dokument aus einer Sammlung in mondodb?

Hier ist mein Dokument:

{ 
    "_id" : ObjectId("5758098356e3930537af15dd"), 
    "manpower_data" : [ 
     { 
      "_id" : ObjectId("5758098356e3930537af15de"), 
      "created" : ISODate("2016-06-08T12:03:15.387Z"),    
      "designation" : "Visiting Evaluator",    
      "evaluatorContactNumber" : "987654321",    
      "evaluatorName" : "Dumy User1", 
      "dealerCodeFor" : "ZSAE876", 
      "region" : "Gurgaon" 
     }, 
     { 
      "_id" : ObjectId("5758098356e3930537af15de"), 
      "created" : ISODate("2016-06-08T12:03:15.387Z"),    
      "designation" : "Resident Evaluator",    
      "evaluatorContactNumber" : "987654321",    
      "evaluatorName" : "Dumy User2", 
      "dealerCodeFor" : "ZSAE877", 
      "region" : "Delhi" 
     } 
    ] 
} 

Wenn ich diese Abfrage ausführen

db.mycollection.find({"manpower_data.dealerCodeFor":"ZSAE876"});

Es gibt mir alle zwei Sub-Dokument, aber ich möchte nur diejenigen manpower data erhalten, die dealerCodeFor passend ist.

Antwort

2

Um Array-Elemente zu filtern, muss die Abfrage projection Phase mit $elemMatch ausgeführt werden. Bitte siehe Beispiel unten:

db.collection.find({ 
    "manpower_data.dealerCodeFor" : "ZSAE876" 
}, { 
    manpower_data : { 
     $elemMatch : { 
      dealerCodeFor : "ZSAE876" 
     } 
    } 
}) 
+0

Es funktioniert. Danke :) –

+1

HINWEIS: - Dies wird nur das erste übereinstimmende Objekt aus dem Array zurückgeben. Wenn es mehrere gibt, werden Sie nicht alle bekommen. – Shrabanee

2

Sie $filter von aggregate-mongodb dies zu erreichen, verwenden können.

Versuchen Sie Folgendes: -

db.collection.aggregate([ 
{ 
    "$match": {"manpower_data.dealerCodeFor":"ZSAE876"} 
}, 
{ 
    "$project": { 
     "manpower_data": { 
      "$filter": { 
       "input": "$manpower_data", 
       "as": "o", 
       "cond": { 
        "$eq": ["$$o.dealerCodeFor", "ZSAE876"] 
       } 
      } 
     } 
    } 
}]) 

Durch die obige Abfrage ausgeführt wird, manpower_data nur die Objekte angezeigt werden können, die Ihren Zustand übereinstimmt.

EDIT: -

Für Version weniger als 2.6.x, versuchen Abfrage folgende: -

db.collection.aggregate([ 
{ 
    "$match": {"manpower_data.dealerCodeFor":"ZSAE876"} 
}, 
{ "$unwind": "$manpower_data" }, 
{ 
    "$match": {"manpower_data.dealerCodeFor":"ZSAE876"} 
}, 
{ 
    "$group": { 
     "$_id": "$_id", 
     "manpower_data": { "$push": "$manpower_data" } 
    } 
}]) 
+0

@Shrebanee Ich betreiben die obige Abfrage aber gab Fehler mir 'abgefangene Ausnahme: Aggregat ist fehlgeschlagen: { \t "errmsg": "Ausnahme: ungültigen Operator '$ filter'", \t "Code": 15999, \t "ok" : 0 } ' –

+0

warum aggregieren hier? ist eine Schrotflinte, um ein wenig Fliege zu töten :-), – profesor79

+0

@ profesor79 Ich dachte, wenn es mehrere Objekte innerhalb des Arrays gibt, die Übereinstimmung der Abfrage, kann die Projektion all dieser Objekte durch Aggregat erfolgen. – Shrabanee