2012-10-16 12 views
5

mamy zbiór elementów, który ma następującą strukturę:MongoDB zaawansowanych zapytań: uzyskać elementy w tablicy pasujących drugi warunek

elementów:

{ 
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] } ] 
} 

Chcemy skuteczny sposób, aby uzyskać Elementy, które mieć przedmiot z kolorem niebieskim dostępny dla grup 5, 9, 27, 123 lub 56. Powinno to zwrócić Element z id 123, ale nie element z identyfikatorem 124, ponieważ element musi spełniać oba warunki. Chcemy, aby zapytanie było jak najbardziej efektywne.

To zapytanie jest sprawna, ale nie spełnia wymogu:

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

ponieważ będzie on pasował id = 124 ponieważ ma przedmiotu, który pasuje do „Blue” i jeszcze jeden, który odpowiada grupie 9.

+0

znalazłem '$ elemMatch' określony [w mon go doc] (http://docs.mongodb.org/manual/tutorial/query-documents/). Jako początkujący uważałem za przydatne przeglądanie wszystkich przykładów z [tam] (http://docs.mongodb.org/manual/tutorial/query-documents/), może ktoś inny to zrobi. –

Odpowiedz

7

You trzeba użyć $elemMatch ponieważ szukasz dopasować wiele atrybutów pojedynczego elementu tablicy:

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