Както вече беше споменато от @Blakes Seven, $group не може да използва индекси. Вижте тази тема .
Така вашето запитване вече е оптимално. Възможен начин за оптимизиране на този случай на използване е предварително изчисляване и запазване на данните в странична колекция.
Можете да опитате тази структура от данни:
{
"_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")
}
Запитването за това може да се извърши за милисекунди вместо за 500+ секунди и можете да се възползвате от индексите.
Тогава, разбира се, всеки път, когато добавяте, актуализирате или изтривате документ от основната колекция, ще трябва да актуализирате страничната колекция.
В зависимост от това колко силно се нуждаете данните да бъдат „пресни“, можете също да изберете да пропуснете този „процес на актуализиране на живо“ и да регенерирате изцяло страничната колекция само веднъж на ден с партида и имайте предвид, че вашите данни може да не са „ прясно".
Друг проблем, който можете да коригирате:вашият сървър определено се нуждае от повече RAM и CPU. Вашият работен набор вероятно не се побира в RAM, особено с този вид агрегиране.
Също така, вероятно можете да използвате добре SSD и аз бих СИЛНО препоръчваме да използвате набор от реплики от 3 възела вместо един екземпляр за производство.