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