Você teve a ideia básica certa, mas
$exists
é uma condição de consulta, portanto, só é válida dentro de um $match
. O que você quer é o $ifNull
operador para essencialmente fazer a mesma coisa: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
} }
] );
Portanto, o
$ifNull
retorna o valor presente do campo se ele existir ou o argumento "lado direito" é retornado se não existir. O valor retornado diferente de false
é interpretado como sendo true
(a menos que o valor seja realmente falso). Essencialmente, isso oferece a mesma funcionalidade de testar logicamente a existência de uma propriedade no documento.