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