जैसा कि @Blakes सेवन द्वारा पहले ही उल्लेख किया गया है, $group अनुक्रमणिका का उपयोग नहीं कर सकता है। देखें यह विषय ।
इस प्रकार, आपकी क्वेरी पहले से ही इष्टतम है। इस यूज़केस को ऑप्टिमाइज़ करने का एक संभावित तरीका डेटा को साइड कलेक्शन में पूर्व-गणना करना और जारी रखना है।
आप इस डेटा संरचना को आजमा सकते हैं:
{
"_id" : ObjectId("560a5139b56a71ea60890201"),
"ccy" : "USDNOK",
"date_time_first" : ISODate("2007-01-01T00:00:07.904Z"),
"date_time_last" : ISODate("2007-09-09T00:00:07.904Z")
}
इसे क्वेरी करना 500+ सेकंड के बजाय मिलीसेकंड में किया जा सकता है और आप इंडेक्स से लाभ उठा सकते हैं।
फिर निश्चित रूप से, हर बार जब आप मुख्य संग्रह से किसी दस्तावेज़ को जोड़ते हैं, अद्यतन करते हैं या हटाते हैं, तो आपको पार्श्व संग्रह को अद्यतन करना होगा।
इस पर निर्भर करते हुए कि आपको "ताज़ा" होने के लिए डेटा की कितनी बुरी आवश्यकता है, आप इस "लाइव अपडेट प्रक्रिया" को छोड़ना भी चुन सकते हैं और बैच के साथ दिन में केवल एक बार साइड कलेक्शन को पूरी तरह से पुन:उत्पन्न कर सकते हैं और ध्यान रखें कि आपका डेटा नहीं हो सकता है " ताज़ा"।
एक और समस्या जिसे आप ठीक कर सकते हैं:आपके सर्वर को निश्चित रूप से अधिक RAM और CPU की आवश्यकता है। आपका वर्किंग सेट शायद RAM में फिट नहीं बैठता है, खासकर इस तरह के एग्रीगेशन के साथ।
साथ ही, आप शायद SSD का अच्छा उपयोग कर सकते हैं और मैं मजबूती से उत्पादन के लिए एकल इंस्टेंस के बजाय 3 नोड्स रेप्लिकसेट का उपयोग करने की अनुशंसा करें।