Betyder detta att om du använder indatavariabler i en $lookuppipeline måste du använda $expr
Ja korrekt, som standard i filter dvs; i filterdelen av .find()
eller i $match
aggregeringsstadiet kan du inte använda ett befintligt fält i dokumentet.
Om du överhuvudtaget behöver använda befintligt fälts värde i ditt frågefilter måste du använda aggregeringspipeline, så för att använda aggregeringspipeline i .find()
eller i $match
du måste avsluta din filterfråga med $expr. Samma sätt att komma åt lokala variabler skapades med let
av $lookup
filtrera i $match
måste lindas av $expr
.
Låt oss överväga nedanstående exempel:
Exempel på dokument:
[
{
"key": 1,
"value": 2
},
{
"key": 2,
"value": 4
},
{
"key": 5,
"value": 5
}
]
Fråga:
db.collection.find({ key: { $gt: 1 }, value: { $gt: 4 } })
Or
db.collection.aggregate([ { $match: { key: { $gt: 1 }, value: { $gt: 4 } } } ])
Test : mongoplayground
Om du ser ovanstående fråga anger du både 1
&4
skickas in i frågan men det kontrollerar du nedanstående fråga där du försöker matcha key
field ==value
fält - det fungerar inte :
db.collection.aggregate([ { $match: { key: { $eq: "$value" } } } ])
Test : mongoplayground
Ovan när du jämför två befintliga fält kan du inte göra det eftersom det betyder att du söker efter dokument med key
fältvärde som sträng "$value"
. Så att säga att det inte är en sträng, det är faktiskt en referens till value
fält du behöver använda $eq aggregeringsoperator istället för $eq frågeoperator som nedan:
db.collection.aggregate([ { $match: { $expr: { $eq: [ "$key", "$value" ] } } } ])
Test : mongoplayground