Cela signifie-t-il que si vous utilisez des variables d'entrée dans un $lookuppipeline, vous devez utiliser $expr
Oui correct, par défaut dans les filtres, c'est-à-dire ; dans la partie filtre de .find()
ou en $match
étape d'agrégation, vous ne pouvez pas utiliser un champ existant dans le document.
Si vous avez besoin d'utiliser la valeur du champ existant dans votre filtre de requête, vous devez utiliser le pipeline d'agrégation, donc pour utiliser le pipeline d'agrégation dans .find()
ou en $match
vous devez envelopper votre requête de filtre avec $expr. La même façon d'accéder aux variables locales a été créée en utilisant let
de $lookup
filtrer dans $match
doit être enveloppé par $expr
.
Considérons ci-dessous l'exemple :
Exemples de documents :
[
{
"key": 1,
"value": 2
},
{
"key": 2,
"value": 4
},
{
"key": 5,
"value": 5
}
]
Requête :
db.collection.find({ key: { $gt: 1 }, value: { $gt: 4 } })
Or
db.collection.aggregate([ { $match: { key: { $gt: 1 }, value: { $gt: 4 } } } ])
Tester : mongoplayground
Si vous voyez la requête ci-dessus, saisissez 1
&4
sont passés dans la requête, mais vous vérifiez ci-dessous la requête où vous essayez de faire correspondre la key
champ ==value
champ - ça ne marche pas :
db.collection.aggregate([ { $match: { key: { $eq: "$value" } } } ])
Tester : mongoplayground
Ci-dessus, lorsque vous comparez deux champs existants, vous ne pouvez pas le faire car cela signifie que vous recherchez des documents avec key
valeur du champ sous forme de chaîne "$value"
. Donc, pour dire que ce n'est pas une chaîne, c'est en fait une référence à value
champ, vous devez utiliser l'opérateur d'agrégation $eq plutôt que l'opérateur de requête $eq comme ci-dessous :
db.collection.aggregate([ { $match: { $expr: { $eq: [ "$key", "$value" ] } } } ])
Tester : mongoplayground