@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秒以上ではなくミリ秒単位で実行でき、インデックスを利用できます。
もちろん、メインコレクションからドキュメントを追加、更新、または削除するたびに、サイドコレクションを更新する必要があります。
データを「最新」にする必要があるかどうかに応じて、この「ライブ更新プロセス」をスキップして、バッチを使用して1日1回だけサイドコレクションを完全に再生成することもできます。また、データが「新鮮」でない場合があることに注意してください。新鮮」。
あなたが修正できるもう一つの問題:あなたのサーバーは間違いなくより多くのRAMとCPUを必要とします。特にこの種の集計では、ワーキングセットがRAMに収まらない可能性があります。
また、SSDをうまく活用できると思いますが、強く 本番環境では、単一のインスタンスではなく、3ノードのレプリカセットを使用することをお勧めします。