Bedeutet dies, dass Sie, wenn Sie Eingabevariablen in einer $lookuppipeline verwenden, $expr
verwenden müssen
Ja richtig, standardmäßig in Filtern, d.h. im Filterteil von .find()
oder in $match
Aggregationsphase können Sie kein vorhandenes Feld im Dokument verwenden.
Wenn überhaupt, wenn Sie den Wert des vorhandenen Felds in Ihrem Abfragefilter verwenden müssen, müssen Sie die Aggregationspipeline verwenden, um also die Aggregationspipeline in .find()
zu verwenden oder in $match
Sie müssen Ihre Filterabfrage mit $expr umschließen. Die gleiche Methode zum Zugriff auf lokale Variablen wurde mit let
erstellt von $lookup
Filter in $match
muss von $expr
umschlossen werden .
Betrachten wir das folgende Beispiel:
Beispieldokumente :
[
{
"key": 1,
"value": 2
},
{
"key": 2,
"value": 4
},
{
"key": 5,
"value": 5
}
]
Abfrage :
db.collection.find({ key: { $gt: 1 }, value: { $gt: 4 } })
Or
db.collection.aggregate([ { $match: { key: { $gt: 1 }, value: { $gt: 4 } } } ])
Test : Mongospielplatz
Wenn Sie die obige Abfrage sehen, geben Sie beide 1
ein &4
werden an die Abfrage übergeben, aber Sie überprüfen die folgende Abfrage, in der Sie versuchen, key
abzugleichen Feld ==value
Feld - es funktioniert nicht :
db.collection.aggregate([ { $match: { key: { $eq: "$value" } } } ])
Test : Mongospielplatz
Wenn Sie oben zwei vorhandene Felder vergleichen, können Sie dies nicht tun, da dies bedeutet, dass Sie mit key
nach Dokumenten suchen Feldwert als Zeichenfolge "$value"
. Es ist also kein String, sondern ein Verweis auf value
Feld müssen Sie den Aggregationsoperator $eq anstelle des Abfrageoperators $eq wie unten verwenden:
db.collection.aggregate([ { $match: { $expr: { $eq: [ "$key", "$value" ] } } } ])
Test : Mongospielplatz