2016-07-25 3 views
0

Ich habe eine Sammlung von Objekten:Abfrage auf 2 Eigenschaften des gleichen eingebettete Objekts in einem Array

db.coll.find().pretty(); 

{ 
    "_id" : "1", 
    "elements" : [ 
     { "key" : "A", "value" : 10 }, 
     { "key" : "B", "value" : 1 }, 
    ] 
}, 
{ 
    "_id" : "2", 
    "elements" : [ 
     { "key" : "A", "value" : 1 }, 
     { "key" : "C", "value" : 33 }, 
    ] 
} 

Ich mag die Dokumente finden, die ein Element mit „Schlüssel“ gleich „A“ enthalten und ihre "Wert" ist größer als 5.

Nicht sicher, ob dies ohne Verwendung des Aggregations-Framework möglich ist.

Antwort

1

Ohne Aggregation mit $elemMatch und Abfrage wird wie unten sein:

db.coll.find({"elements":{"$elemMatch":{"$and":[{"key":"A"},{"value":{"$gt":5}}]}}}).pretty() 

oder wenn Sie Aggregation verwenden möchten verwendet dann folgende Abfrage für die Aggregation

db.coll.aggregate({"$unwind":"$elements"},{"$match":{"$and":[{"elements.key":"A"},{"elements.value":{"$gt":5}}]}}).pretty() 
1

Hier ist die Abfrage

db.coll.find({elements: {$elemMatch: {key: "A", value: {$gt: 5}}}});

Es verwendet den $ elemMatch-Operator. Der Operator $ elemMatch vergleicht Dokumente, die ein Arrayfeld mit mindestens einem Element enthalten, das allen angegebenen Abfragekriterien entspricht. (Siehe the documentation)

Verwandte Themen