私は約 30,000 個のアイテムのコレクションを持っており、そのすべてに Program という要素があります。「プログラム」は複合インデックスの最初の部分であるため、特定のプログラム値を持つアイテムの検索は非常に高速です。範囲クエリを実行するのも高速です。たとえば、次のようになります。
db.MyCollection.find(
{ $and: [ { Program: { "$gte" : "K", "$lt" : "L" } },
{ Program: { "$gte" : "X", "$lt" : "Y" } } ] }).count();
上記のクエリは、重複しない 2 つの範囲 (KL) と (XY)) の重複をクエリしているため、結果を返しません。左の範囲 (KL) には、約 7K のアイテムが含まれています。
ただし、2 番目の「and」句を「where」式に置き換えると、クエリの実行に時間がかかります。
db.MyCollection.find(
{ $and: [ { Program: { "$gte" : "K", "$lt" : "L" } }, { "$where" : "this.Program == \"Z\"" } ] }).count();
ご覧のとおり、上記のクエリも空の結果セットを返すはずです (範囲 KL は Program=="Z" と組み合わされています)。「where」のパフォーマンスが遅いことは承知していますが、Mongo は最初に left 句を評価して潜在的な結果セットを削減し (約 7K 項目になります)、「where」チェックを適用するべきではありませんか? その場合、この操作の実行中に約 3 GB の RAM を消費する Mongo サービスを使用しているマシンでは、数千のアイテムの処理に数分ではなく数秒かかるのではないでしょうか? 比較的小さなコレクションには重すぎるように見えます。