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

L'operatore di query $expr non sembra funzionare con la notazione a punti dell'array

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:

espressioni :