Vysvětlím to na příkladu. Zvažte kolekci arrays
. Obsahuje pole s názvem arr
což je řada vložených dokumentů (s poli a
a b
).
Některé dokumenty v arrays
kolekce:
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 2, "arr" : [ { "a" : "a1", "b" : "b11" }, { "a" : "a2", "b" : "b22" } ] }
{ "_id" : 3, "arr" : [ { "a" : "a2", "b" : "b1" }, { "a" : "a", "b" : "b1" } ] }
{ "_id" : 4, "arr" : [ { "a" : "a1", "b" : "b91" }, { "a" : "a29", "b" : "b1" } ] }
Chci najít všechny dokumenty s poli embedded-document a="a1"
AND b="b1"
. Všimněte si, že to musí být v rámci stejného prvku embedded-document pole. Používám $elemMatch za tímto účelem a získejte požadovaný výsledek.
> db.arrays.find( { arr: { $elemMatch: { a: "a1", b: "b1" } } } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
Nyní, když použiji $and operátor jako v následujícím dotazu, výsledky nejsou správné. Jak vidíte, je vybrán další dokument. Dotaz fungoval s poli vloženého dokumentu pole a="a1"
NEBO b="b1"
.
> db.arrays.find({$and: [ { "arr.a": "a1" }, { "arr.b": "b1" } ] } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 4, "arr" : [ { "a" : "a1", "b" : "b91" }, { "a" : "a29", "b" : "b1" } ] }
Takže pomocí $and
operátor NENÍ určen pro tento účel (tj. dotazování na více polí pole dílčích dokumentů).
Také k dotazu na pole vloženého dokumentu pole (pouze jedno pole ) $elemMatch
není vyžadováno, například:
> db.arrays.find( { "arr.a": "a2" } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 2, "arr" : [ { "a" : "a1", "b" : "b11" }, { "a" : "a2", "b" : "b22" } ] }
{ "_id" : 3, "arr" : [ { "a" : "a2", "b" : "b1" }, { "a" : "a", "b" : "b1" } ] }