Du havde den rigtige grundlæggende idé, men $exists
er en forespørgselsbetingelse, så den er kun gyldig i en $match
. Det, du ønsker, er $ifNull
operatør til i det væsentlige at gøre det samme:
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
} }
] );
Så $ifNull
enten returnerer den nuværende værdi af feltet, hvis det findes, eller "højre side"-argumentet returneres, hvis det ikke gør det. Den returnerede værdi ud over false
tolkes som værende sand
(medmindre værdien selvfølgelig er falsk).
Dette giver dig i bund og grund den samme funktionalitet til logisk at teste for eksistensen af en egenskab i dokumentet.