Du hade rätt grundidé men $exists
är ett frågevillkor så det är endast giltigt inom en $match
. Det du vill ha är $ifNull
operatören att göra samma sak:
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
antingen returnerar fältets nuvärde om det finns eller så returneras argumentet "höger sida" om det inte gör det. Det returnerade värdet annat än false
tolkas som sant
(såvida inte värdet faktiskt är falskt).
Detta ger dig i huvudsak samma funktionalitet för att logiskt testa om det finns en egenskap i dokumentet.