ここで理解していないように見えるのは、 $exists
たとえまばらであっても、インデックスを「つかむ」ことはできません。ドキュメント自体にあるように:
これらのページに示されている例は、{ "$exists": false }
です。 クエリ。ただし、ここでは逆論理条件は何の違いもありません。
「スパース」インデックスの「完全なメリット」を得るには、インデックスが保持するデータの「タイプ」を考慮し、適切にクエリを実行する必要があります。
数値の場合、次のようになります:
db.collection.find({ "a": "foobar", "b": { "$gte": -9999, "$lte": 9999 } })
これはインデックスを使用し、スパースインデックスを使用します。またはテキストベースの場合:
db.collection.find({ "a": "foobar", "b": /.+/ })
これもスパースインデックスを使用し、「b」が定義されているもののみを調べます。
「アレイ」の場合は「注意」してください。これを行わない限り、調べている値はおそらく上記の1つです:
db.collection.insert({ "a": 1, "b": [[]] })
それならこれで大丈夫です:
db.ab.find({ "a": 1, "b": { "$type": 4 } })
しかし、同じ理由で「スパース」インデックスを実際に使用することはありません$exists
ここでは機能しません。
したがって、ここでの用語の意味を理解し、最大のパフォーマンスを期待する場合に作成したインデックス定義を使用するには、「適切にクエリを実行する」必要があります。
これらは、自分でテストして結果が正しいことを確認できる明確な例です。これらの点についてコアドキュメントがより明確になっていることを願っていますが、多くの人が貢献しようとした(そして優れた説明を作成した)ことも承知していますが、これまでに含まれていません。
それがあなたがここで尋ねている理由だと思います。