Měli jste správnou základní myšlenku, ale $exists
je podmínka dotazu, takže je platná pouze v $match
. To, co chcete, je $ifNull
operátora v podstatě udělat totéž:
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že $ifNull
buď vrátí současnou hodnotu pole, pokud existuje, nebo vrátí argument "pravá strana", pokud neexistuje. Vrácená hodnota jiná než false
je interpretováno jako true
(pokud ovšem hodnota není ve skutečnosti nepravdivá).
V podstatě vám to poskytuje stejnou funkcionalitu logického testování existence vlastnosti v dokumentu.