Như đã được đề cập bởi @Blakes Seven, $ group không thể sử dụng các chỉ mục. Xem chủ đề này .
Do đó, truy vấn của bạn đã tối ưu. Một cách khả thi để tối ưu hóa usecase này là tính toán trước và duy trì dữ liệu trong một tập hợp phụ.
Bạn có thể thử cấu trúc dữ liệu này:
{
"_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")
}
Việc truy vấn điều này có thể được thực hiện trong mili giây thay vì hơn 500 giây và bạn có thể hưởng lợi từ các chỉ mục.
Tất nhiên, mỗi khi bạn thêm, cập nhật hoặc xóa một tài liệu khỏi bộ sưu tập chính, bạn sẽ cần cập nhật bộ sưu tập phụ.
Tùy thuộc vào mức độ bạn cần dữ liệu "mới", bạn cũng có thể chọn bỏ qua "quy trình cập nhật trực tiếp" này và tạo lại hoàn toàn bộ sưu tập phụ chỉ một lần mỗi ngày với một lô và lưu ý rằng dữ liệu của bạn có thể không " tươi mới ".
Một vấn đề khác mà bạn có thể khắc phục:Máy chủ của bạn chắc chắn cần thêm RAM và CPU. Bộ làm việc của bạn có thể không phù hợp với RAM, đặc biệt là với loại tổng hợp này.
Ngoài ra, bạn có thể sử dụng tốt ổ SSD và tôi sẽ MẠNH MẼ recommand bằng cách sử dụng Replicaset 3 nút thay vì một phiên bản duy nhất để sản xuất.