Anda memiliki ide dasar yang tepat tetapi $exists
adalah kondisi kueri sehingga hanya valid dalam $match
. Yang Anda inginkan adalah $ifNull
operator untuk pada dasarnya melakukan hal yang sama:
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
} }
] );
Jadi $ifNull
baik mengembalikan nilai sekarang dari bidang jika ada atau argumen "sisi kanan" dikembalikan jika tidak. Nilai yang dikembalikan selain false
ditafsirkan sebagai true
( kecuali tentu saja nilainya benar-benar salah ).
Pada dasarnya ini memberi Anda fungsionalitas yang sama untuk menguji secara logis keberadaan properti dalam dokumen.