Jak już wspomniał @Blakes Seven, $group nie może używać indeksów. Zobacz ten temat .
W ten sposób Twoje zapytanie jest już optymalne. Możliwym sposobem optymalizacji tego przypadku użycia jest wstępne obliczenie i utrwalenie danych w kolekcji bocznej.
Możesz wypróbować tę strukturę danych:
{
"_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")
}
Zapytanie o to można wykonać w milisekundach zamiast w ciągu ponad 500 sekund i możesz skorzystać z indeksów.
Oczywiście za każdym razem, gdy dodajesz, aktualizujesz lub usuwasz dokument z głównej kolekcji, musisz zaktualizować kolekcję boczną.
W zależności od tego, jak bardzo potrzebujesz „świeżych” danych, możesz również pominąć ten „proces aktualizacji na żywo” i całkowicie zregenerować kolekcję poboczną tylko raz dziennie za pomocą partii i pamiętać, że Twoje dane mogą nie być „ świeże".
Kolejny problem, który możesz naprawić:Twój serwer zdecydowanie potrzebuje więcej pamięci RAM i procesora. Twój zestaw roboczy prawdopodobnie nie mieści się w pamięci RAM, szczególnie w przypadku tego rodzaju agregacji.
Ponadto prawdopodobnie możesz dobrze wykorzystać dysk SSD, a ja SILNIE polecam użycie 3 węzłów Replicaset zamiast pojedynczej instancji do produkcji.