sql >> Base de Datos >  >> NoSQL >> MongoDB

El operador de consulta $expr no parece funcionar con la notación de punto de matriz

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:

expresiones :