Zoals reeds vermeld door @Blakes Seven, kan $group geen indexen gebruiken. Zie dit onderwerp .
Uw zoekopdracht is dus al optimaal. Een mogelijke manier om deze usecase te optimaliseren is om de gegevens vooraf te berekenen en te bewaren in een nevenverzameling.
Je zou deze datastructuur kunnen proberen:
{
"_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")
}
Dit opvragen kan in milliseconden in plaats van 500+ seconden en u kunt profiteren van indexen.
Dan moet u natuurlijk elke keer dat u een document toevoegt, bijwerkt of verwijdert uit de hoofdverzameling, de zijverzameling bijwerken.
Afhankelijk van hoe hard u de gegevens "vers" wilt hebben, kunt u er ook voor kiezen om dit "live-updateproces" over te slaan en de nevenverzameling slechts eenmaal per dag volledig opnieuw te genereren met een batch en er rekening mee te houden dat uw gegevens mogelijk niet " vers".
Een ander probleem dat u zou kunnen oplossen:uw server heeft zeker meer RAM en CPU nodig. Je werkset past waarschijnlijk niet in RAM, zeker niet bij dit soort aggregaties.
U kunt waarschijnlijk ook goed gebruik maken van een SSD en ik zou STERK raad aan om een replicaset met 3 knooppunten te gebruiken in plaats van een enkele instantie voor productie.