Comme déjà mentionné par @Blakes Seven, $group ne peut pas utiliser d'index. Voir ce sujet .
Ainsi, votre requête est déjà optimale. Une façon possible d'optimiser ce cas d'utilisation est de pré-calculer et de conserver les données dans une collection secondaire.
Vous pouvez essayer cette structure de données :
{
"_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")
}
L'interrogation peut être effectuée en quelques millisecondes au lieu de plus de 500 secondes et vous pouvez bénéficier des index.
Ensuite, bien sûr, chaque fois que vous ajoutez, mettez à jour ou supprimez un document de la collection principale, vous devrez mettre à jour la collection secondaire.
Selon à quel point vous avez besoin que les données soient "fraîches", vous pouvez également choisir d'ignorer ce "processus de mise à jour en direct" et de régénérer entièrement la collection latérale une seule fois par jour avec un lot et de garder à l'esprit que vos données peuvent ne pas être " frais".
Un autre problème que vous pourriez résoudre :votre serveur a certainement besoin de plus de RAM et de CPU. Votre ensemble de travail ne tient probablement pas dans la RAM, en particulier avec ce type d'agrégations.
De plus, vous pouvez probablement faire bon usage d'un SSD et je le ferais FORTEMENT recommande d'utiliser un Replicaset à 3 nœuds au lieu d'une seule instance pour la production.