$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 :