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