Der $expr
erlaubt nur die Verwendung von Aggregationsausdrucksoperatoren . Die von Ihnen verwendete Punktnotation funktioniert nicht, um auf das Array-Element für das Feld "values" : [ 1 ]
. Sie müssen das $arrayElemAt
verwenden Operator, und es funktioniert gut.
Ihr Code find({$expr: {$eq: ["$value1", "$value2"]}})
hat funktioniert, weil der $expr
verwendet den Aggregationsausdrucksoperator $eq
, nicht der Operator $eq
Und der Code find({$expr: {$eq: ["$value1", "$values.0"]}})
hat nicht funktioniert - wie erwartet. Im Aggregationsoperator die $values.0
, die 0
wird als Feldname interpretiert, nicht als Index eines Array-Felds.
Die Punktnotation funktioniert gut in $expr
Auch. Hier ist ein Beispiel mit Beispieldokument:
{ "_id" : 1, "val" : { "0" : 99, "a" : 11 } }
Verwenden Sie jetzt den $expr
und Punktnotation:
db.test.find({ $expr: { $eq: [ "$val.0", 99 ] } } )
db.test.find({ $expr: { $eq: [ "$val.a", 11 ] } } )
Beide Abfragen geben das Dokument zurück - die Übereinstimmung erfolgt mit dem Filter, der den $expr
verwendet und die Punktnotation. Dies gilt jedoch nur für eingebettete (oder untergeordnete) Dokumente nicht mit Array-Feldern.
Bilden Sie die Dokumentation Aggregation Pipeline Operators sagt: