sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB:uso de la coincidencia con las variables del documento de entrada

¿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 } } } ])

Prueba: parque infantil mongo

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" } } } ])

Prueba: parque infantil mongo

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" ] } } } ])

Prueba: parque infantil mongo