आपके पास सही मूल विचार था लेकिन $exists
एक क्वेरी शर्त है इसलिए केवल $match
. आप जो चाहते हैं वह है $ifNull
ऑपरेटर अनिवार्य रूप से एक ही काम करने के लिए:
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
} }
] );
तो $ifNull
या तो फ़ील्ड का वर्तमान मान लौटाता है यदि यह मौजूद है या "दाईं ओर" तर्क वापस किया जाता है यदि ऐसा नहीं होता है। false
. के अलावा लौटाया गया मान true
. के रूप में व्याख्या की जाती है (जब तक कि मूल्य वास्तव में गलत न हो)।
अनिवार्य रूप से यह आपको दस्तावेज़ में किसी संपत्ति के अस्तित्व के लिए तार्किक रूप से परीक्षण करने की समान कार्यक्षमता प्रदान करता है।