Seperti yang sudah disebutkan oleh @Blakes Seven, $group tidak dapat menggunakan indeks. Lihat topik ini .
Dengan demikian, kueri Anda sudah optimal. Cara yang mungkin untuk mengoptimalkan kasus penggunaan ini adalah dengan menghitung sebelumnya dan mempertahankan data dalam kumpulan sampingan.
Anda dapat mencoba struktur data ini :
{
"_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")
}
Mengkueri hal ini dapat dilakukan dalam milidetik, bukan 500+ detik, dan Anda dapat memperoleh manfaat dari indeks.
Kemudian tentu saja, setiap kali Anda menambah, memperbarui, atau menghapus dokumen dari koleksi utama, Anda perlu memperbarui koleksi samping.
Bergantung pada seberapa parah Anda membutuhkan data untuk menjadi "segar", Anda juga dapat memilih untuk melewati "proses pembaruan langsung" ini dan membuat ulang seluruh koleksi sampingan hanya sekali sehari dengan batch dan perlu diingat bahwa data Anda mungkin tidak " segar".
Masalah lain yang dapat Anda perbaiki:Server Anda pasti membutuhkan lebih banyak RAM &CPU. Perangkat kerja Anda mungkin tidak cocok dengan RAM, terutama dengan agregasi semacam ini.
Selain itu, Anda mungkin dapat memanfaatkan SSD dengan baik dan saya akan SANGAT merekomendasikan menggunakan Replika 3 node alih-alih satu instance untuk produksi.