यह समझना महत्वपूर्ण है कि एग्रीगेट () के तर्क में ऑपरेशन एक पाइपलाइन . बनाते हैं . इसका मतलब है कि पाइपलाइन के किसी भी तत्व का इनपुट पाइपलाइन में पिछले तत्व द्वारा उत्पादित दस्तावेजों की धारा है।
आपके उदाहरण में, आपकी पहली क्वेरी इस तरह दिखने वाले दस्तावेज़ों की एक पाइपलाइन बनाती है:
{
"_id" : 2,
"avg_score" : 5.5
},
{
"_id" : 1,
"avg_score" : 4
}
इसका मतलब है कि पाइपलाइन का दूसरा तत्व दस्तावेजों की एक श्रृंखला देख रहा है जहां केवल कुंजी "_id" और "avg_score" हैं। कुंजियाँ "category_id" और "score" अब मौजूद नहीं हैं इस दस्तावेज़ स्ट्रीम में।
यदि आप इस स्ट्रीम पर और अधिक एकत्रीकरण करना चाहते हैं, तो आपको उन कुंजियों का उपयोग करना होगा जो इस चरण में पाइपलाइन में दिखाई देती हैं। चूंकि आप औसत को औसत करना चाहते हैं, आपको _id फ़ील्ड के लिए एक स्थिर मान डालने की आवश्यकता है, ताकि सभी इनपुट दस्तावेज़ एक ही परिणाम में समूहित हो जाएं।
निम्नलिखित कोड सही परिणाम देता है:
db.questions.aggregate(
{ $group : {
_id : "$category_id",
avg_score : { $avg : "$score" },
}
},
{ $group : {
_id : "all",
avg_score : { $avg : "$avg_score" },
}
}
);
जब चलाया जाता है, तो यह निम्न आउटपुट उत्पन्न करता है:
{
"result" : [
{
"_id" : "all",
"avg_score" : 4.75
}
],
"ok" : 1
}