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

MongoDB:Match mit Eingabedokumentvariablen verwenden

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