$expr tillåter användning endast av operatörer för aggregationsuttryck . Punktnotationen du använder kommer inte att fungera för att komma åt arrayelementet för fältet "values" : [ 1 ] . Du måste använda $arrayElemAt operatör, och det fungerar bra.
Din kod find({$expr: {$eq: ["$value1", "$value2"]}}) fungerade, eftersom $expr använde operatorn för aggregeringsuttryck $eq
, inte MongoDB Query Language (MQL) operatör $eq . Observera att båda operatorerna ser likadana ut, men användningen och syntaxen är olika.
Och koden find({$expr: {$eq: ["$value1", "$values.0"]}}) fungerade inte - som förväntat. I aggregeringsoperatorn $values.0 , 0 tolkas som fältnamn, inte ett index för ett matrisfält.
Punktnotationen fungerar bra i $expr också. Här är ett exempel, med exempeldokument:
{ "_id" : 1, "val" : { "0" : 99, "a" : 11 } }
Använder nu $expr och punktnotation:
db.test.find({ $expr: { $eq: [ "$val.0", 99 ] } } )
db.test.find({ $expr: { $eq: [ "$val.a", 11 ] } } )
Båda frågorna returnerar dokumentet - matchningen sker med filtret med $expr och punktnotationen. Men detta är endast giltigt med inbäddade (eller underordnade) dokument inte med matrisfält.
Bilda dokumentationen, Aggregation Pipeline Operators säger:
uttryck :