यहां मूल मामला .aggregate()
$unwind
के साथ
क्योंकि आपको अपनी समूह कुंजी के रूप में सरणी में मानों तक पहुंच की आवश्यकता है और निश्चित रूप से $group
क्योंकि इसी तरह आप चीजों को "ग्रुप" करते हैं:
db.collection.aggregate([
{ "$match": { "auctionId": 22 } },
{ "$unwind": "$itmLst" },
{ "$group": {
"_id": "$itmLst.category",
"count": { "$sum": 1 }
}}
])
यह आपको आउटपुट देगा जैसे:
{ "_id": "ANTIQUES", "count": 56 }
{ "_id": "TOOLS", "count": 89 }
{ "_id": "JEWLRY", "count": 45 }
अब आपको वास्तव में इसके साथ रहना सीखना चाहिए, क्योंकि डिफ़ॉल्ट कर्सर प्रारूप में "सूची" एक अच्छी बात है जो स्वाभाविक रूप से चलने योग्य है। इसके अलावा IMHO नामित कुंजियाँ स्वाभाविक रूप से डेटा प्रस्तुति के लिए खुद को उधार नहीं देती हैं और आप आम तौर पर एक पुनरावृत्त सूची में एक सामान्य संपत्ति चाहते हैं।
यदि आप वास्तव में एकवचन नामित कुंजी आउटपुट का उपयोग करने के इरादे से हैं, तो आपको $arrayToObject
जो आपको मानों को कुंजियों के नाम के रूप में उपयोग करने की अनुमति देगा, और निश्चित रूप से $replaceRoot
उस एक्सप्रेशन आउटपुट को नए दस्तावेज़ के रूप में उपयोग करने के लिए:
db.collection.aggregate([
{ "$match": { "auctionId": 22 } },
{ "$unwind": "$itmLst" },
{ "$group": {
"_id": "$itmLst.category",
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": null,
"data": { "$push": { "k": "$_id", "v": "$count" } }
}},
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": "$data"
}
}}
])
या यदि आपके पास वह विकल्प नहीं है, तो इसके बजाय आपको कर्सर आउटपुट को कोड में बदलना चाहिए:
db.collection.aggregate([
{ "$match": { "auctionId": 22 } },
{ "$unwind": "$itmLst" },
{ "$group": {
"_id": "$itmLst.category",
"count": { "$sum": 1 }
}}
]).toArray().reduce((acc,curr) =>
Object.assign(acc,{ [curr._id]: curr.count }),
{}
)
दोनों मूल एकत्रीकरण आउटपुट से नामित कुंजियों के साथ एक ही ऑब्जेक्ट में विलीन हो जाते हैं:
{
"ANTIQUES": 56,
"TOOLS": 89,
"JEWLRY": 45,
...
}
और यह दिखाने के लिए जाता है कि मूल आउटपुट परिणाम वास्तव में पर्याप्त था, और आम तौर पर आप चाहते हैं कि उस तरह का "फाइनल रीशेपिंग" उस कोड में किया जाए जो कर्सर आउटपुट का उपयोग करता है, अगर आपको वास्तव में मूल के बाद से उस रीशेपिंग की भी आवश्यकता है वैसे भी आवश्यक डेटा वापस कर दिया गया था।