2012-10-16 4 views
5

Wir haben eine Sammlung von Elementen, die die folgende Struktur aufweist:MongoDB erweiterte Abfrage: get Elemente in einem Array eine zweite Bedingung für:

Elemente:

{ 
id : 123, 
items : [ { color: "blue", "groups" : [3, 5] }, { color: "red", "groups" : [6, 8] } ] 
} 

{ 
id : 124, 
items : [ { color: "blue", "groups" : [1, 2] }, { color: "green", "groups" : [5, 9] } ] 
} 

wir eine effiziente Art und Weise wollen Elemente zu erhalten, Für die Gruppen 5, 9, 27, 123 oder 56 muss ein Element mit der Farbe Blau verfügbar sein. Dies sollte Element mit der ID 123, aber nicht Element mit der ID 124 zurückgeben, da das Element beide Bedingungen erfüllen muss. Wir möchten, dass die Abfrage so effizient wie möglich ist.

Diese Abfrage ist effizient, aber erfüllt nicht die Anforderung:

{$and : { "items.groups" : { $in : [5, 9, 27, 123, 56] }, "items.color" : "blue" }} 

wie es id = 124 überein, da es ein Element, das „blaue“ und eine andere Gruppe übereinstimmt, die 9.

+0

I '$ elemMatch' angegeben [im mon gefunden gehe doc] (http://docs.mongodb.org/manual/tutorial/query-documents/). Als Anfänger fand ich es nützlich, alle Beispiele von [dort] (http://docs.mongodb.org/manual/tutorial/query-documents/) zu sehen, vielleicht jemand anderes dazu. –

Antwort

7

Sie Spiele müssen $elemMatch verwenden, da Sie suchen mehrere Attribute eines einzelnen Array-Elements entsprechen:

db.test.find({ items: { $elemMatch: { 
    color: "blue", 
    groups: { $in: [5, 9, 27, 123, 56] } 
}}}); 
Verwandte Themen