El $expr
permite el uso de operadores de expresiones de agregación solo . La notación de puntos que está utilizando no funcionará para acceder al elemento de matriz para el campo "values" : [ 1 ]
. Necesitas usar el $arrayElemAt
operador, y funciona bien.
Tu código find({$expr: {$eq: ["$value1", "$value2"]}})
funcionó, porque el $expr
usó el operador de expresión de agregación $eq
, no el operador de MongoDB Query Language (MQL) $eq . Tenga en cuenta que ambos operadores se parecen, pero el uso y la sintaxis son diferentes.
Y, el código find({$expr: {$eq: ["$value1", "$values.0"]}})
no funcionó, como se esperaba. En el operador de agregación el $values.0
, el 0
se interpreta como nombre de campo, no como índice de un campo de matriz.
La notación de puntos funciona bien en $expr
además. Aquí hay un ejemplo, con un documento de muestra:
{ "_id" : 1, "val" : { "0" : 99, "a" : 11 } }
Ahora usando el $expr
y notación de punto:
db.test.find({ $expr: { $eq: [ "$val.0", 99 ] } } )
db.test.find({ $expr: { $eq: [ "$val.a", 11 ] } } )
Ambas consultas devuelven el documento:la coincidencia ocurre con el filtro usando $expr
y la notación de punto. Pero esto es válido solo con documentos incrustados (o sub) no con campos de matriz.
Forme la documentación, Operadores de tubería de agregación dice: