Betekent dit dat als u invoervariabelen gebruikt in een $lookuppipeline, u $expr
moet gebruiken
Ja correct, standaard in filters, d.w.z.; in filtergedeelte van .find() of in $match aggregatiefase kunt u geen bestaand veld in het document gebruiken.
Als u de waarde van het bestaande veld in uw queryfilter al moet gebruiken, moet u de aggregatiepijplijn gebruiken, dus om de aggregatiepijplijn in .find() te gebruiken of in $match je moet je filterquery inpakken met $expr. Dezelfde manier om toegang te krijgen tot lokale variabelen is gemaakt met let van $lookup filter in $match moet worden ingepakt door $expr .
Laten we eens kijken naar onderstaand voorbeeld:
Voorbeelddocumenten:
[
{
"key": 1,
"value": 2
},
{
"key": 2,
"value": 4
},
{
"key": 5,
"value": 5
}
]
Vraag:
db.collection.find({ key: { $gt: 1 }, value: { $gt: 4 } })
Or
db.collection.aggregate([ { $match: { key: { $gt: 1 }, value: { $gt: 4 } } } ])
Testen: mongospeeltuin
Als u de bovenstaande vraag ziet, voert u beide 1 . in &4 worden doorgegeven aan de zoekopdracht, maar controleer hieronder waar u probeert te matchen met key veld ==value veld - het werkt niet :
db.collection.aggregate([ { $match: { key: { $eq: "$value" } } } ])
Test : mongospeeltuin
Hierboven, aangezien u twee bestaande velden vergelijkt, kunt u dat niet doen, omdat u op zoek bent naar documenten met key veldwaarde als string "$value" . Dus om te zeggen dat het geen string is, is het eigenlijk een verwijzing naar value veld moet u de $eq aggregatie-operator gebruiken in plaats van de $eq query-operator zoals hieronder:
db.collection.aggregate([ { $match: { $expr: { $eq: [ "$key", "$value" ] } } } ])
Test : mongospeeltuin