Som redan nämnts av @Blakes Seven, kan $group inte använda index. Se det här ämnet .
Din fråga är alltså redan optimal. Ett möjligt sätt att optimera detta användningsfall är att förberäkna och bevara data i en sidosamling.
Du kan prova denna datastruktur:
{
"_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")
}
Att fråga efter detta kan göras på millisekunder istället för 500+ sekunder och du kan dra nytta av index.
Sedan måste du naturligtvis uppdatera sidosamlingen varje gång du lägger till, uppdaterar eller tar bort ett dokument från huvudsamlingen.
Beroende på hur mycket du behöver att data ska vara "färsk", kan du också välja att hoppa över denna "live-uppdateringsprocess" och helt återskapa sidosamlingen bara en gång om dagen med en batch och tänk på att din data kanske inte är " färskt".
Ett annat problem du kan fixa:Din server behöver definitivt mer RAM och CPU. Din arbetsuppsättning passar förmodligen inte i RAM, speciellt med den här typen av aggregationer.
Dessutom kan du förmodligen dra nytta av en SSD och jag skulle STARKT rekommenderar att du använder en replikaset med tre noder istället för en enda instans för produktion.