Wie bereits von @Blakes Seven erwähnt, kann $group keine Indizes verwenden. Siehe dieses Thema .
Somit ist Ihre Abfrage bereits optimal. Eine mögliche Möglichkeit zur Optimierung dieses Anwendungsfalls besteht darin, die Daten in einer Nebensammlung vorab zu berechnen und zu speichern.
Sie könnten diese Datenstruktur versuchen:
{
"_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")
}
Die Abfrage kann in Millisekunden statt in über 500 Sekunden erfolgen, und Sie können von Indizes profitieren.
Dann müssten Sie natürlich jedes Mal, wenn Sie ein Dokument aus der Hauptsammlung hinzufügen, aktualisieren oder löschen, die Nebensammlung aktualisieren.
Je nachdem, wie dringend Sie die „Aktualität“ der Daten benötigen, können Sie diesen „Live-Update-Prozess“ auch überspringen und die Seitensammlung nur einmal täglich mit einem Stapel neu generieren und bedenken, dass Ihre Daten möglicherweise nicht „ frisch".
Ein weiteres Problem, das Sie beheben könnten:Ihr Server benötigt definitiv mehr RAM und CPU. Ihr Arbeitssatz passt wahrscheinlich nicht in den Arbeitsspeicher, insbesondere bei dieser Art von Aggregationen.
Außerdem können Sie eine SSD wahrscheinlich gut gebrauchen, und ich würde STRENG empfehlen die Verwendung eines 3-Knoten-Replicasets anstelle einer einzelnen Instanz für die Produktion.