¿Significa esto que si está usando variables de entrada en un $lookuppipeline tiene que usar $expr
Sí, correcto, por defecto en los filtros, es decir; en la parte del filtro de .find()
o en $match
etapa de agregación no puede usar un campo existente en el documento.
En todo caso, si necesita usar el valor del campo existente en su filtro de consulta, entonces necesita usar la canalización de agregación, por lo tanto, para usar la canalización de agregación en .find()
o en $match
necesita envolver su consulta de filtro con $expr. Se creó la misma forma de acceder a las variables locales usando let
de $lookup
filtrar en $match
necesita ser envuelto por $expr
.
Consideremos el siguiente ejemplo:
Documentos de muestra:
[
{
"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 } } } ])
Si ve la consulta anterior, ingrese 1
&4
se pasan a la consulta, pero si verifica debajo de la consulta donde intenta hacer coincidir key
campo ==value
campo - no funciona :
db.collection.aggregate([ { $match: { key: { $eq: "$value" } } } ])
Arriba, ya que está comparando dos campos existentes, entonces no puede hacerlo, ya que significa que está buscando documentos con key
valor de campo como cadena "$value"
. Entonces, para decir que no es una cadena, en realidad es una referencia a value
campo necesita usar el operador de agregación $eq en lugar del operador de consulta $eq como se muestra a continuación:
db.collection.aggregate([ { $match: { $expr: { $eq: [ "$key", "$value" ] } } } ])