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

Der $expr-Abfrageoperator scheint nicht mit der Array-Punkt-Notation zu funktionieren

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 . Beachten Sie, dass beide Operatoren gleich aussehen, aber die Verwendung und Syntax unterschiedlich ist.

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:

Ausdrücke :