O
$expr
permite o uso de Operadores de Expressão de Agregação somente . A notação de ponto que você está usando não funcionará para acessar o elemento do array para o campo "values" : [ 1 ]
. Você precisa usar o $arrayElemAt
operador, e funciona bem. Seu código
find({$expr: {$eq: ["$value1", "$value2"]}})
funcionou, porque o $expr
usou o operador de expressão de agregação $eq
, não o operador do MongoDB Query Language (MQL) $eq . Observe que ambos os operadores são parecidos, mas o uso e a sintaxe são diferentes. E o código
find({$expr: {$eq: ["$value1", "$values.0"]}})
não funcionou - como esperado. No operador de agregação o $values.0
, o 0
é interpretado como nome de campo, não como índice de um campo de matriz. A notação de ponto funciona bem em
$expr
também. Aqui está um exemplo, com documento de amostra:{ "_id" : 1, "val" : { "0" : 99, "a" : 11 } }
Agora usando o
$expr
e notação de ponto:db.test.find({ $expr: { $eq: [ "$val.0", 99 ] } } )
db.test.find({ $expr: { $eq: [ "$val.a", 11 ] } } )
Ambas as consultas retornam o documento - a correspondência acontece com o filtro usando o
$expr
e a notação de ponto. Mas, isso é válido apenas com documentos incorporados (ou sub) não com campos de matriz. Forme a documentação, Operadores de pipeline de agregação diz:
expressões :