MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

O operador de consulta $ expr parece não funcionar com a notação de ponto de matriz


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 :