Jag kommer att förklara detta med ett exempel. Tänk på samlingen arrays
. Den har ett fält som heter arr
som är en rad inbäddade dokument (med fält a
och b
).
Vissa dokument i arrays
samling:
{ "_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" } ] }
Jag vill hitta alla dokument med fälten för array inbäddade dokument a="a1"
OCH b="b1"
. Observera att detta måste vara inom samma element inbäddade dokument i arrayen. Jag använder $elemMatch för detta och få önskat resultat.
> db.arrays.find( { arr: { $elemMatch: { a: "a1", b: "b1" } } } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
Nu, om jag använder $and operatör som i följande fråga, är resultaten inte korrekta. Som du kan se är ett ytterligare dokument valt. Frågan fungerade med fälten för array inbäddade dokument a="a1"
ELLER 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" } ] }
Så, med hjälp av $and
operatören är INTE avsedd för detta ändamål (dvs. frågar på flera fält i en rad underdokument).
Dessutom, för att fråga på ett fält för inbäddade array-dokument (endast ett fält ) $elemMatch
krävs inte, till exempel:
> 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" } ] }