Sie hatten die richtige Grundidee, aber $exists
ist eine Abfragebedingung und ist daher nur innerhalb eines $match
. Was Sie wollen, ist der $ifNull
Operator im Wesentlichen dasselbe tun:
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
} }
] );
Also der $ifNull
Gibt entweder den aktuellen Wert des Felds zurück, falls vorhanden, oder das Argument "rechte Seite" wird zurückgegeben, wenn dies nicht der Fall ist. Der zurückgegebene Wert außer false
wird als true
interpretiert (es sei denn, der Wert ist tatsächlich falsch).
Im Wesentlichen gibt Ihnen dies die gleiche Funktionalität des logischen Testens auf das Vorhandensein einer Eigenschaft im Dokument.