sql >> Databasteknik >  >> NoSQL >> MongoDB

$expr frågeoperator verkar inte fungera med array dot notation

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




  1. Kör kartreducering för alla nycklar i samlingar - mongodb

  2. Stor fördröjning när du använder Selleri + Redis

  3. moveChunk misslyckades med att koppla TO-shard i dataöverföringen:kan inte acceptera nya bitar eftersom

  4. Kan redis helt ersätta mysql?