Vous aviez la bonne idée de base mais $exists
est une condition de requête et n'est donc valide que dans un $match
. Ce que vous voulez, c'est le $ifNull
opérateur pour faire essentiellement la même chose :
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
} }
] );
Ainsi, le $ifNull
soit renvoie la valeur actuelle du champ s'il existe, soit l'argument "côté droit" est renvoyé s'il n'existe pas. La valeur renvoyée autre que false
est interprété comme étant true
(sauf si bien sûr la valeur est réellement fausse).
Cela vous donne essentiellement la même fonctionnalité de test logique de l'existence d'une propriété dans le document.