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