MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB:qual è la differenza tra $elemMatch e $e per trovare oggetti all'interno dell'array?

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