MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB:Was ist der Unterschied zwischen $elemMatch und $and, um Objekte innerhalb eines Arrays zu finden?

Ich werde dies anhand eines Beispiels erläutern. Betrachten Sie die Sammlung arrays . Es hat ein Feld namens arr das ist ein Array von eingebetteten Dokumenten (mit den Feldern a und b ).

Einige Dokumente in den arrays Sammlung:

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

Ich möchte alle Dokumente mit den eingebetteten Dokumentfeldern des Arrays a="a1" finden UND b="b1" . Beachten Sie, dass dies innerhalb des gleichen Elements embedded-document des Arrays sein muss. Ich verwende $elemMatch dafür und erhalten Sie das gewünschte Ergebnis.

> db.arrays.find( { arr: { $elemMatch: { a: "a1", b: "b1" } } } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }

Wenn ich jetzt das $and verwende Operator wie in der folgenden Abfrage, sind die Ergebnisse nicht korrekt. Wie Sie sehen können, ist ein zusätzliches Dokument ausgewählt. Die Abfrage funktionierte mit den eingebetteten Dokumentfeldern des Arrays a="a1" ODER 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" } ] }

Verwenden Sie also $and -Operator ist NICHT für diesen Zweck vorgesehen (d. h. Abfragen mehrerer Felder eines Arrays von Teildokumenten).

Auch zur Abfrage eines Array-Embedded-Document-Felds (nur ein Feld ) das $elemMatch ist nicht erforderlich, zum Beispiel:

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