Estoy ejecutando una función agregada a continuación. Un documento puede o no tener un elemento, y solo quiero devolver verdadero/falso. El elemento es enorme si existe, por lo que devolver el elemento completo crea muchos problemas y no es necesario.
Como introducción al problema, estoy en un entorno de producción en la versión 3.0.4 y actualizar a 3.4 no es una opción en este momento, aunque parece que esa versión tiene mejores soluciones.
Para probar esto, tengo un documento en una colección mycollection . El documento tiene un elemento exists que es un objeto que contiene otros elementos. No tiene un elemento llamado notexists
db.runCommand({ "aggregate": "mycollection", "pipeline": [{ "$match": {...} }, { "$sort": {...} }, { "$group": {...} }, { "$limit": 10 }, { "$project": { "aggregated": { "$map": { "input": "$mycollection", "as": "document", "in": { "exists_test":{"$eq":["$$document.exists",null]}, "not_exists_test":{"$eq":["$$document.notexists",null]}, "exists_test_ifnull":{"$ifNull":["$$document.exists","test"]}, "not_exists_test_ifnull":{"$ifNull":["$$document.notexists","test"]}, "exists_content": "$$document.exists" ... } } }, "success": { "$cond": { "if": { "$gt": ["$status", 0] }, "then": "false", "else": "true" } } } }] })Desafortunadamente, esto devuelve un documento:
{ aggregated: [{ "exists_test": false, (correct) "not_exists_test": false, (wrong) "exists_test_ifnull": content from document.exists, (correct) "not_exists_test_ifnull": "test", (correct) "exists_content": content from document.exists, (correct) }] } Parece que "not_exists_test":{"$eq":["$$document.notexists",null]}, debería devolver verdadero, ya que $ifNull refleja con precisión que el valor es nulo.
Pruebe "not_exists_test": { "$gt": ["$$document.notexists", null] } , como se indica en el orden de comparación de tipos BSON .
Para Mongodb 3.2, funciona con un solo signo $,
"not_exists_test": { "$gt": ["$document.notexists", null] }