Ik zal dit uitleggen met een voorbeeld. Overweeg de verzameling arrays . Het heeft een veld genaamd arr dat is een array van ingesloten documenten (met velden a en b ).
Sommige documenten in de arrays collectie:
{ "_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" } ] }
Ik wil alle documenten vinden met de array embedded-document velden a="a1" EN b="b1" . Merk op dat dit binnen hetzelfde element ingesloten-document van de array moet zijn. Ik gebruik $elemMatch hiervoor en krijg het gewenste resultaat.
> db.arrays.find( { arr: { $elemMatch: { a: "a1", b: "b1" } } } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
Als ik nu de $en operator zoals in de volgende query, zijn de resultaten niet correct. Zoals u kunt zien, is er een extra document geselecteerd. De query werkte met de array embedded-document velden a="a1" OF 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" } ] }
Dus, met behulp van de $and operator is NIET bedoeld voor dit doel (d.w.z. vragen op meerdere velden van een reeks subdocumenten).
Ook om een query uit te voeren op een veld in een matrix ingesloten document (slechts één veld ) de $elemMatch is niet vereist, bijvoorbeeld:
> 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" } ] }