Jak již zmínil @Blakes Seven, $group nemůže používat indexy. Viz toto téma .
Váš dotaz je tedy již optimální. Možným způsobem, jak optimalizovat tento případ použití, je předem vypočítat a uchovat data ve vedlejší kolekci.
Můžete zkusit tuto datovou strukturu:
{
"_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")
}
Tento dotaz lze provést v milisekundách namísto 500+ sekund a můžete těžit z indexů.
Potom samozřejmě pokaždé, když přidáte, aktualizujete nebo odstraníte dokument z hlavní kolekce, budete muset aktualizovat vedlejší kolekci.
V závislosti na tom, jak moc potřebujete, aby byla data „čerstvá“, můžete se také rozhodnout tento „proces aktualizace v reálném čase“ přeskočit a zcela znovu vygenerovat postranní sbírku pouze jednou denně s dávkou a mějte na paměti, že vaše data nemusí být „ čerstvé".
Další problém, který byste mohli vyřešit:Váš server rozhodně potřebuje více RAM a CPU. Vaše pracovní sada se pravděpodobně nevejde do RAM, zvláště s tímto druhem agregací.
Také pravděpodobně můžete dobře využít SSD a já bych SILNĚ doporučovat použití 3uzlové replikační sady namísto jediné instance pro produkci.