अपने पहले प्रश्न का उत्तर देने के लिए:$group
नहीं करता है आदेश को सुरक्षित रखें। परिवर्तनों के लिए खुले अनुरोध हैं जो पृष्ठभूमि को थोड़ा हाइलाइट भी करते हैं लेकिन ऐसा नहीं लगता कि इनपुट दस्तावेज़ों के क्रम को संरक्षित करने के लिए उत्पाद को बदला जाएगा:
- https://jira.mongodb.org/browse/SERVER-24799
- https://jira.mongodb.org/browse/SERVER-4507
- https://jira.mongodb.org/browse/SERVER-21022
सामान्य तौर पर दो बातें कही जा सकती हैं:आप आम तौर पर पहले समूह बनाना चाहते हैं और फिर छँटाई करना चाहते हैं। इसका कारण यह है कि कम तत्वों को छाँटना (जो समूह आमतौर पर उत्पन्न करता है) सभी इनपुट दस्तावेज़ों को छाँटने की तुलना में तेज़ होने वाला है।
दूसरे, MongoDB यथासंभव कुशलतापूर्वक और कम से कम सॉर्ट करना सुनिश्चित करने जा रहा है। दस्तावेज़ीकरण राज्य:
तो इस कोड से आपके मामले में काम हो जाता है:
collection.aggregate({
$group: {
_id: '$age',
names: { $push: '$name' }
}
}, {
$sort: {
'_id': 1
}
}, {
$limit: 10
})
संपादित करें आपकी टिप्पणियों के बाद:
मैं आपकी बात से सहमत हूं। और आपके तर्क को थोड़ा और आगे ले जाते हुए, मैं यहाँ तक कहूँगा:यदि $group
एक इंडेक्स का उपयोग करने के लिए पर्याप्त स्मार्ट था तो उसे $sort
. की भी आवश्यकता नहीं होनी चाहिए शुरुआत में मंच। दुर्भाग्य से, यह नहीं है (अभी तक शायद नहीं)। आज जैसे हालात हैं, $group
कभी भी किसी अनुक्रमणिका का उपयोग नहीं करेगा और यह निम्न चरणों के आधार पर शॉर्टकट नहीं लेगा ($limit
इस मामले में)। यह भी देखें लिंक
जहां किसी ने कुछ बुनियादी परीक्षण किए।
एकत्रीकरण ढांचा अभी भी बहुत छोटा है, इसलिए मुझे लगता है, एकत्रीकरण पाइपलाइन को स्मार्ट और तेज बनाने के लिए बहुत काम किया जा रहा है।
यहां StackOverflow पर उत्तर दिए गए हैं (उदा. यहां
) जहां लोग एक अग्रिम $sort
. का उपयोग करने का सुझाव देते हैं किसी भी तरह एक इंडेक्स का उपयोग करने के लिए मोंगोडीबी को "मजबूर" करने के लिए चरण। हालांकि, इसने मेरे परीक्षणों को धीमा कर दिया (विभिन्न यादृच्छिक वितरणों का उपयोग करके आपके नमूना आकार के 1 मिलियन रिकॉर्ड)।
जब एकत्रीकरण पाइपलाइन के प्रदर्शन की बात आती है, तो $match
शुरुआत में चरण वही हैं जो वास्तव में सबसे अधिक मदद करते हैं। यदि आप शुरुआत से ही पाइपलाइन से गुजरने वाले रिकॉर्ड की कुल मात्रा को सीमित कर सकते हैं तो यह आपकी सबसे अच्छी शर्त है - जाहिर है...;)