Apa yang tampaknya tidak Anda pahami di sini adalah bahwa $exists
tidak dapat "mengambil" indeks dengan cara apa pun, meskipun jarang. Seperti yang dikatakan oleh dokumentasi itu sendiri:
Contoh yang diberikan di halaman tersebut adalah { "$exists": false }
pertanyaan. Tetapi kondisi logika terbalik tidak membuat perbedaan apa pun di sini.
Untuk mendapatkan "manfaat penuh" dari indeks "jarang", Anda perlu mempertimbangkan "jenis" data yang disimpannya dan melakukan kueri dengan tepat.
Untuk numerik, seperti:
db.collection.find({ "a": "foobar", "b": { "$gte": -9999, "$lte": 9999 } })
Yang menggunakan indeks, dan yang jarang. Atau untuk berbasis teks:
db.collection.find({ "a": "foobar", "b": /.+/ })
Yang juga akan menggunakan indeks sparse dan hanya melihat di mana "b" didefinisikan.
Untuk "array" lalu "hati-hati". Karena nilai yang dilihat mungkin salah satu di atas kecuali Anda melakukan ini:
db.collection.insert({ "a": 1, "b": [[]] })
Di mana maka ini baik-baik saja:
db.ab.find({ "a": 1, "b": { "$type": 4 } })
Tetapi tidak benar-benar akan menggunakan indeks "jarang" untuk alasan yang sama $exists
tidak akan berfungsi di sini.
Jadi, Anda perlu memahami apa arti istilah di sini, dan "meminta dengan tepat" untuk menggunakan definisi indeks yang Anda buat jika Anda mengharapkan kinerja yang maksimal.
Ini adalah contoh jelas yang dapat Anda uji sendiri dan lihat hasilnya benar. Saya berharap dokumentasi inti lebih jelas tentang poin-poin ini, tetapi saya juga sadar banyak yang telah mencoba berkontribusi (dan telah menghasilkan penjelasan yang sangat baik) tetapi tidak satu pun dari ini yang dimasukkan hingga saat ini.
Kira itu sebabnya Anda bertanya di sini.