Il $expr
consente l'utilizzo di operatori di espressioni di aggregazione solo . La notazione del punto che stai utilizzando non funzionerà per accedere all'elemento dell'array per il campo "values" : [ 1 ]
. Devi usare $arrayElemAt
operatore e funziona bene.
Il tuo codice find({$expr: {$eq: ["$value1", "$value2"]}})
ha funzionato, perché $expr
utilizzato l'operatore dell'espressione di aggregazione $eq
, non l'operatore del MongoDB Query Language (MQL) $eq . Nota che entrambi gli operatori sono simili, ma l'utilizzo e la sintassi sono diversi.
E il codice find({$expr: {$eq: ["$value1", "$values.0"]}})
non ha funzionato - come previsto. Nell'operatore di aggregazione il $values.0
, il 0
viene interpretato come nome di campo, non indice di un campo di matrice.
La notazione del punto funziona bene in $expr
anche. Ecco un esempio, con documento di esempio:
{ "_id" : 1, "val" : { "0" : 99, "a" : 11 } }
Ora usando il $expr
e notazione punto:
db.test.find({ $expr: { $eq: [ "$val.0", 99 ] } } )
db.test.find({ $expr: { $eq: [ "$val.a", 11 ] } } )
Entrambe le query restituiscono il documento:la corrispondenza avviene con il filtro utilizzando $expr
e la notazione del punto. Ma questo è valido solo con i documenti incorporati (o secondari) non con campi di matrice.
Forma la documentazione, Operatori di pipeline di aggregazione dice: