MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB:utilizzo della corrispondenza con le variabili del documento di input

Questo significa che se stai usando variabili di input in una $lookuppipeline devi usare $expr

Sì corretto, per impostazione predefinita nei filtri cioè; nella parte del filtro di .find() o in $match fase di aggregazione non puoi utilizzare un campo esistente nel documento.

Se è necessario utilizzare il valore del campo esistente nel filtro della query, è necessario utilizzare la pipeline di aggregazione, quindi per utilizzare la pipeline di aggregazione in .find() o in $match devi racchiudere la query del filtro con $expr. Lo stesso modo per accedere alle variabili locali è stato creato usando let di $lookup filtra in $match deve essere racchiuso da $expr .

Consideriamo di seguito l'esempio:

Documenti di esempio :

[
  {
    "key": 1,
    "value": 2
  },
  {
    "key": 2,
    "value": 4
  },
  {
    "key": 5,
    "value": 5
  }
]

Query :

 db.collection.find({ key: { $gt: 1 }, value: { $gt: 4 } })

    Or

 db.collection.aggregate([ { $match: { key: { $gt: 1 }, value: { $gt: 4 } } } ])

Test : parco giochi mongo

Se vedi la query sopra, entrambi inserisci 1 &4 vengono passati alla query, ma se controlli sotto la query in cui provi a far corrispondere la key campo ==value campo - non funziona :

db.collection.aggregate([ { $match: { key: { $eq: "$value" } } } ])

Test : parco giochi mongo

Sopra, mentre stai confrontando due campi esistenti, non puoi farlo perché significa che stai controllando i documenti con key valore del campo come stringa "$value" . Quindi, per dire che non è una stringa, in realtà è un riferimento a value campo è necessario utilizzare l'operatore di aggregazione $eq anziché l'operatore di query $eq come di seguito:

 db.collection.aggregate([ { $match: { $expr: { $eq: [ "$key", "$value" ] } } } ])

Test : parco giochi mongo