Това, което изглежда не разбирате тук, е, че $exists
не може да "грабне" индекс по никакъв начин, дори когато е рядък. Както се казва в самата документация:
Примерът, даден в тези страници, е { "$exists": false }
заявка. Но обратното логическо условие не прави никаква разлика тук.
За да получите „пълната полза“ от „разредения“ индекс, тогава трябва да вземете предвид „типа“ на данните, които той съдържа, и да направите заявка по подходящ начин.
За числови, нещо като:
db.collection.find({ "a": "foobar", "b": { "$gte": -9999, "$lte": 9999 } })
Което използва индекс и разредения. Или за базирани на текст:
db.collection.find({ "a": "foobar", "b": /.+/ })
Което също ще използва разредения индекс и ще разглежда само тези, където е дефинирано "b".
За "масиви" тогава "внимавайте". Тъй като стойността, която се разглежда, вероятно е една от горните, освен ако не сте направили това:
db.collection.insert({ "a": 1, "b": [[]] })
Къде тогава това е наред:
db.ab.find({ "a": 1, "b": { "$type": 4 } })
Но всъщност няма да използва и „разредения“ индекс поради същите причини $exists
няма да работи тук.
Така че трябва да разберете какво означават термините тук и да „заявите по подходящ начин“, за да използвате дефинициите на индекса, които създавате, ако очаквате максимална производителност.
Това са ясни примери, които можете да тествате сами и да видите, че резултатите са верни. Иска ми се основната документация да е по-ясна по тези точки, но също така съм наясно, че много са се опитали да допринесат (и са създали отлични обяснения), но нито едно от тях не е включено до момента.
Предполагам, че затова питате тук.