Jeg vil forklare dette med et eksempel. Overvej samlingen arrays
. Den har et felt kaldet arr
som er en række indlejrede dokumenter (med felter a
og b
).
Nogle dokumenter 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" } ] }
Jeg vil finde alle dokumenter med array-indlejrede-dokument-felterne a="a1"
OG b="b1"
. Bemærk, at dette skal være inden for det samme element indlejrede dokument i arrayet. Jeg bruger $elemMatch for dette og få det ønskede resultat.
> db.arrays.find( { arr: { $elemMatch: { a: "a1", b: "b1" } } } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
Hvis jeg nu bruger $og operatør som i følgende forespørgsel, er resultaterne ikke korrekte. Som du kan se, er et ekstra dokument valgt. Forespørgslen fungerede med array-indlejrede-dokument-felterne 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å ved at bruge $and
operatør er IKKE beregnet til dette formål (dvs. at forespørge på flere felter i en række underdokumenter).
Også for at forespørge på et array-indlejret dokumentfelt (kun ét felt ) $elemMatch
er ikke påkrævet, for eksempel:
> 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" } ] }