Tenías la idea básica correcta pero $exists
es una condición de consulta, por lo que solo es válida dentro de un $match
. Lo que quieres es $ifNull
operador para hacer esencialmente lo mismo:
db.mycollection.aggregate( [
{ "$group": {
"_id" : { "user_id": "$user_id" },
"requestA_count": { "$sum": {
"$cond": [ { "$ifNull": ["$requestA", false] }, 1, 0 ]
} },
"requestB_count": { "$sum": {
"$cond": [ { "$ifNull": ["$requestB", false] }, 1, 0 ]
} },
"requestC_count": { "$sum": {
"$cond": [ { "$ifNull": ["$requestC", false] }, 1, 0 ]
} },
} },
{ "$project": {
"_id": 0,
"user_id": "$_id.user_id",
"requestA_count": 1,
"requestB_count": 1,
"requestC_count": 1
} }
] );
Entonces, el $ifNull
devuelve el valor actual del campo si existe o se devuelve el argumento del "lado derecho" si no existe. El valor devuelto que no sea false
se interpreta como true
(a menos, por supuesto, que el valor sea realmente falso).
Esencialmente, esto le brinda la misma funcionalidad de probar lógicamente la existencia de una propiedad en el documento.