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