Je had het juiste basisidee, maar $exists
is een vraagvoorwaarde en is dus alleen geldig binnen een $match
. Wat je wilt is de $ifNull
operator om in wezen hetzelfde te doen:
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
} }
] );
Dus de $ifNull
ofwel retourneert de huidige waarde van het veld als het bestaat of het argument "rechterkant" wordt geretourneerd als dat niet het geval is. De geretourneerde waarde anders dan false
wordt geïnterpreteerd als true
( tenzij de waarde natuurlijk onwaar is ).
Dit geeft u in wezen dezelfde functionaliteit als logisch testen op het bestaan van een eigenschap in het document.