पहली चीज़ जो आप यहाँ गलत कर रहे हैं, वह यह नहीं समझ पा रही है कि कैसे $project
काम करने का इरादा है। पाइपलाइन चरण जैसे $project
और $group
केवल उन क्षेत्रों को आउटपुट करेगा जो "स्पष्ट रूप से" पहचाने गए हैं। इसलिए केवल वे फ़ील्ड जिन्हें आप आउटपुट के लिए कहते हैं, निम्न पाइपलाइन चरणों के लिए उपलब्ध होंगे।
विशेष रूप से यहां आप अपने दस्तावेज़ में "यू" फ़ील्ड का केवल "प्रोजेक्ट" करते हैं और इसलिए आपने अन्य डेटा को उपलब्ध होने से हटा दिया है। अब यहां मौजूद एकमात्र फ़ील्ड "नाम" है, जिसे आपने "अनुमानित" किया है।
शायद ऐसा कुछ करने का आपका इरादा वास्तव में था:
db.collectiontmp.aggregate([
{ "$group": {
"_id": {
"_id": "$u._id",
"email": { "$toUpper": "$u.e" }
},
"total": { "$sum": 1 },
}},
{ "$project": {
"_id": 0,
"email": "$_id.email",
"total": 1
}},
{ "$sort": { "total": -1 } },
{ "$limit": 10 }
])
या यहां तक कि:
db.collectiontmp.aggregate([
{ "$group": {
"_id": "$u._id",
"email": { "$first": { "$toUpper": "$u.e" } }
"total": { "$sum": 1 },
}},
{ "$project": {
"_id": 0,
"email": 1,
"total": 1
}},
{ "$sort": { "total": -1 } },
{ "$limit": 10 }
])
इससे आपको वह आउटपुट मिलता है जिसकी आप तलाश कर रहे हैं।
याद रखें कि चूंकि यह एक "पाइपलाइन" है, तो पहले चरण से केवल "आउटपुट" ही "अगले" चरण के लिए उपलब्ध होता है। दस्तावेज़ की कोई "वैश्विक" अवधारणा नहीं है क्योंकि यह SQL में एक घोषणात्मक कथन नहीं है, बल्कि एक "पाइपलाइन" है।
तो सोचो यूनिक्स पाइप "|" आदेश दें, या अन्यथा देखें। तब आपकी सोच सही हो जाएगी।