Lo spiegherò con un esempio. Considera la raccolta arrays
. Ha un campo chiamato arr
che è una matrice di documenti incorporati (con campi a
e b
).
Alcuni documenti negli arrays
collezione:
{ "_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" } ] }
Voglio trovare tutti i documenti con i campi del documento incorporato nell'array a="a1"
E b="b1"
. Nota che deve trovarsi all'interno dello stesso elemento embedded-document dell'array. Uso $elemMatch per questo e ottenere il risultato desiderato.
> db.arrays.find( { arr: { $elemMatch: { a: "a1", b: "b1" } } } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
Ora, se uso $e operatore come nella query seguente, i risultati non sono corretti. Come puoi vedere, è selezionato un documento aggiuntivo. La query ha funzionato con i campi del documento incorporato dell'array a="a1"
OPPURE 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" } ] }
Quindi, usando $and
operatore NON è destinato a questo scopo (ad esempio, eseguire query su più campi di una matrice di documenti secondari).
Inoltre, per eseguire query su un campo di documenti incorporati nell'array (solo un campo ) il $elemMatch
non è richiesto, ad esempio:
> 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" } ] }