Wydaje się, że nie rozumiesz tutaj, że $exists
nie może w żaden sposób "złapać" indeksu, nawet jeśli jest rzadki. Jak mówi sama dokumentacja:
Przykład podany na tych stronach to { "$exists": false }
zapytanie. Ale odwrotny warunek logiczny nie ma tutaj żadnego znaczenia.
Aby uzyskać „pełne korzyści” z „rzadkiego” indeksu, należy wziąć pod uwagę „typ” przechowywanych danych i odpowiednio wykonać zapytanie.
W przypadku liczb, coś takiego:
db.collection.find({ "a": "foobar", "b": { "$gte": -9999, "$lte": 9999 } })
Który używa indeksu i rzadkiego. Lub w przypadku tekstu:
db.collection.find({ "a": "foobar", "b": /.+/ })
Który również użyje rzadkiego indeksu i spojrzy tylko na te, w których zdefiniowano „b”.
W przypadku „tablic” następnie „bądź ostrożny”. Ponieważ wartość, na którą patrzysz, jest prawdopodobnie jedną z powyższych, chyba że tak zrobiłeś:
db.collection.insert({ "a": 1, "b": [[]] })
Gdzie w takim razie jest to w porządku:
db.ab.find({ "a": 1, "b": { "$type": 4 } })
Ale tak naprawdę nie użyje "rzadkiego" indeksu z tych samych powodów $exists
tutaj nie zadziała.
Musisz więc zrozumieć, co oznaczają te terminy, i przeprowadzić odpowiednie zapytania, aby użyć definicji indeksów, które tworzysz, jeśli oczekujesz maksymalnej wydajności.
Są to jasne przykłady, które możesz przetestować na sobie i zobaczyć, że wyniki są prawdziwe. Chciałbym, aby podstawowa dokumentacja była jaśniejsza w tych punktach, ale jestem również świadomy, że wielu próbowało wnieść swój wkład (i przedstawiło doskonałe wyjaśnienia), ale żadne z nich nie zostało do tej pory uwzględnione.
Chyba dlatego pytasz tutaj.