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