Was Sie hier anscheinend nicht verstehen, ist, dass $exists
kann einen Index in keiner Weise "greifen", auch wenn er spärlich ist. Wie die Dokumentation selbst sagt:
Das Beispiel auf diesen Seiten ist ein { "$exists": false }
Anfrage. Aber die umgekehrte logische Bedingung macht hier keinen Unterschied.
Um den "vollen Nutzen" eines "sparse" Index zu erhalten, müssen Sie den "Typ" der darin enthaltenen Daten berücksichtigen und entsprechend abfragen.
Für numerisch etwas wie:
db.collection.find({ "a": "foobar", "b": { "$gte": -9999, "$lte": 9999 } })
Welche einen Index verwendet, und den spärlichen. Oder für textbasierte:
db.collection.find({ "a": "foobar", "b": /.+/ })
Das wird auch den Sparse-Index verwenden und nur diejenigen betrachten, in denen "b" definiert wurde.
Bei "arrays" dann "sei vorsichtig". Da der betrachtete Wert wahrscheinlich einer der oben genannten ist, es sei denn, Sie haben Folgendes getan:
db.collection.insert({ "a": 1, "b": [[]] })
Wobei das dann in Ordnung ist:
db.ab.find({ "a": 1, "b": { "$type": 4 } })
Aber wird den "sparse" Index auch nicht wirklich verwenden aus den gleichen Gründen $exists
funktioniert hier nicht.
Sie müssen also verstehen, was die Begriffe hier bedeuten, und "angemessen abfragen", um die von Ihnen erstellten Indexdefinitionen zu verwenden, wenn Sie die maximale Leistung erwarten.
Dies sind klare Beispiele, die Sie selbst testen können und sehen, dass die Ergebnisse wahr sind. Ich wünschte, die Kerndokumentation wäre in diesen Punkten klarer, aber ich bin mir auch bewusst, dass viele versucht haben, einen Beitrag zu leisten (und ausgezeichnete Erklärungen geliefert haben), aber bisher keine davon aufgenommen wurde.
Vermutlich fragst du deshalb hier.