En una expresión ( $expr ), y solo en una expresión, quiero verificar la presencia de un campo con una ruta de navegación .
db.haystack.aggregate( [ { '$match': { '$expr': { 'abc': { '$ne': null } }, }, }, ], ); Pero recibo un error FieldPath field names may not contain '.'
¿Cómo se puede verificar la presencia de un campo en un $expr ? Si alguna parte de las rutas no está presente, quiero rechazar el documento.
{ a: 1 } // False { a: { b: 1 } } // False { a: { b: { c: 1 } } // TrueTiene dos problemas en su código, primero porque requiere el uso de $expr , comprendamos cuál es $expr's :
Los argumentos pueden ser cualquier expresión de agregación válida. Para obtener más información, consulte Expresiones.
Entonces $expr recibe una "expresión de agregación" que es:
Las expresiones pueden incluir rutas de campo, literales, variables del sistema, objetos de expresión y operadores de expresión. Las expresiones se pueden anidar.
Entonces, la entrada actual de {"abc":{"$ne":null}} no es ninguna de estas, en este caso, desea usar el formulario de agregación $ne, que es:
{ $ne: [ ... args ... ] }
Ahora viene el segundo problema, espera este comportamiento de consulta especial en el que se consulta un null que coincide con valores nulos y campos faltantes al mismo tiempo. Sin embargo, esto no existe para el marco de agregación, solo el lenguaje de consulta.
Hay muchas formas posibles de evitar esto, pero aquí hay una solución usando $type
db.collection.aggregate([ { "$match": { "$expr": { $ne: [ { $type: "$abc" }, "missing" ] } } }, ])