Miałeś dobry podstawowy pomysł, ale $exists
jest warunkiem zapytania, więc obowiązuje tylko w przypadku $match
. To, czego potrzebujesz, to $ifNull
operatora, aby zasadniczo zrobić to samo:
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
} }
] );
Tak więc $ifNull
albo zwraca bieżącą wartość pola, jeśli istnieje, albo zwracany jest argument „prawa strona”, jeśli nie. Zwrócona wartość inna niż false
jest interpretowany jako prawdziwy
(chyba że oczywiście wartość jest fałszywa).
Zasadniczo daje to tę samą funkcjonalność logicznego testowania istnienia właściwości w dokumencie.