Ce que vous ne semblez pas comprendre ici, c'est que $exists
ne peut "saisir" un index de quelque manière que ce soit, même s'il est clairsemé. Comme le dit la documentation elle-même :
L'exemple donné dans ces pages est un { "$exists": false }
requête. Mais la condition logique inverse ne fait aucune différence ici.
Afin de tirer pleinement parti d'un index "épars", vous devez tenir compte du "type" de données qu'il contient et interroger de manière appropriée.
Pour numérique, quelque chose comme :
db.collection.find({ "a": "foobar", "b": { "$gte": -9999, "$lte": 9999 } })
Qui utilise un index, et celui fragmenté. Ou pour le texte :
db.collection.find({ "a": "foobar", "b": /.+/ })
Qui utilisera également l'index clairsemé et ne regardera que ceux où "b" a été défini.
Pour "tableaux" alors "soyez prudent". Comme la valeur examinée est probablement l'une des valeurs ci-dessus, à moins que vous n'ayez fait ceci :
db.collection.insert({ "a": 1, "b": [[]] })
Où alors c'est correct :
db.ab.find({ "a": 1, "b": { "$type": 4 } })
Mais ne va pas vraiment utiliser l'index "sparse" non plus pour les mêmes raisons $exists
ne fonctionnera pas ici.
Vous devez donc comprendre ce que les termes signifient ici et "interroger de manière appropriée" afin d'utiliser les définitions d'index que vous créez si vous vous attendez à des performances maximales.
Ce sont des exemples clairs que vous pouvez tester par vous-même et voir que les résultats sont vrais. Je souhaite que la documentation de base soit plus claire sur ces points, mais je suis également conscient que beaucoup ont essayé de contribuer (et ont produit d'excellentes explications), mais aucune d'entre elles n'a été incluse à ce jour.
Je suppose que c'est pourquoi vous demandez ici.