MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB:Usando correspondência com variáveis ​​de documento de entrada


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