$expr
umożliwia użycie tylko operatorów wyrażeń agregacji . Notacja kropkowa, której używasz, nie będzie działać w celu uzyskania dostępu do elementu tablicy dla pola "values" : [ 1 ]
. Musisz użyć $arrayElemAt
operatora i działa dobrze.
Twój kod find({$expr: {$eq: ["$value1", "$value2"]}})
zadziałało, ponieważ $expr
użył operatora wyrażenia agregacji $eq
, nie operator języka zapytań MongoDB (MQL) $eq . Zauważ, że oba operatory wyglądają podobnie, ale ich użycie i składnia są inne.
I kod find({$expr: {$eq: ["$value1", "$values.0"]}})
nie działało - zgodnie z oczekiwaniami. W operatorze agregacji $values.0
, 0
jest interpretowany jako nazwa pola, a nie indeks pola tablicy.
Notacja z kropkami działa dobrze w $expr
Również. Oto przykład z przykładowym dokumentem:
{ "_id" : 1, "val" : { "0" : 99, "a" : 11 } }
Teraz używam $expr
i notacja z kropkami:
db.test.find({ $expr: { $eq: [ "$val.0", 99 ] } } )
db.test.find({ $expr: { $eq: [ "$val.a", 11 ] } } )
Oba zapytania zwracają dokument — dopasowanie następuje z filtrem przy użyciu $expr
i notacji kropkowej. Ale dotyczy to tylko osadzonych (lub podrzędnych) dokumentów nie z polami tablicy.
Skorzystaj z dokumentacji, Operatorzy potoku agregacji mówi: