Isso significa que, se você estiver usando variáveis de entrada em um $ lookuppipeline, precisará usar $ expr
Sim correto, por padrão nos filtros, ou seja; na parte do filtro de
.find()
ou em $match
estágio de agregação, você não pode usar um campo existente no documento. Se você precisar usar o valor do campo existente em seu filtro de consulta, precisará usar o pipeline de agregação, portanto, para usar o pipeline de agregação em
.find()
ou em $match
você precisa envolver sua consulta de filtro com $expr. A mesma maneira de acessar variáveis locais foi criada usando let
de $lookup
filtrar em $match
precisa ser encapsulado por $expr
. Vamos considerar o exemplo abaixo:
Documentos de amostra:
[
{
"key": 1,
"value": 2
},
{
"key": 2,
"value": 4
},
{
"key": 5,
"value": 5
}
]
Consulta:
db.collection.find({ key: { $gt: 1 }, value: { $gt: 4 } })
Or
db.collection.aggregate([ { $match: { key: { $gt: 1 }, value: { $gt: 4 } } } ])
Teste: mongoplayground
Se você vir a consulta acima, insira
1
&4
são passados para a consulta, mas você verifica abaixo da consulta onde tenta corresponder key
campo ==value
campo - não funciona:db.collection.aggregate([ { $match: { key: { $eq: "$value" } } } ])
Teste: mongoplayground
Acima, como você está comparando dois campos existentes, não pode fazer isso, pois significa que está verificando documentos com
key
valor do campo como string "$value"
. Então, para dizer que não é uma string, na verdade é uma referência a value
campo você precisa usar o operador de agregação $eq em vez do operador de consulta $eq como abaixo: db.collection.aggregate([ { $match: { $expr: { $eq: [ "$key", "$value" ] } } } ])
Teste: mongoplayground