$expr
позволява използването само на оператори на агрегиращи изрази . Нотацията с точка, която използвате, няма да работи за достъп до елемента на масива за полето "values" : [ 1 ]
. Трябва да използвате $arrayElemAt
оператор и работи добре.
Вашият код find({$expr: {$eq: ["$value1", "$value2"]}})
работи, защото $expr
използва оператора на израза за агрегиране $eq
,не операторът на езика за заявки MongoDB (MQL) $eq . Забележете, че и двата оператора изглеждат еднакви, но употребата и синтаксисът са различни.
И кодът find({$expr: {$eq: ["$value1", "$values.0"]}})
не проработи - според очакванията. В оператора за агрегиране $values.0
, 0
се интерпретира като име на поле, а не като индекс на поле от масив.
Точковата нотация работи добре в $expr
също. Ето пример с примерен документ:
{ "_id" : 1, "val" : { "0" : 99, "a" : 11 } }
Сега използвам $expr
и нотация с точка:
db.test.find({ $expr: { $eq: [ "$val.0", 99 ] } } )
db.test.find({ $expr: { $eq: [ "$val.a", 11 ] } } )
И двете заявки връщат документа - съвпадението се случва с филтъра, използващ $expr
и нотацията с точка. Но това е валидно само с вградени (или под) документи не с масивни полета.
Формирайте документацията, Оператори на тръбопроводи за агрегиране казва:
изрази :