Det du inte verkar förstå här är att $exists
kan inte "ta" ett index på något sätt, även om det är gles. Som dokumentationen själv säger:
Exemplet som ges på dessa sidor är en { "$exists": false }
fråga. Men det omvända logiska villkoret gör ingen skillnad här.
För att få "full nytta" av ett "gles" index måste du överväga vilken "typ" av data det innehåller och fråga på lämpligt sätt.
För numeriska, något som:
db.collection.find({ "a": "foobar", "b": { "$gte": -9999, "$lte": 9999 } })
Som använder ett index, och det sparsamma. Eller för textbaserad:
db.collection.find({ "a": "foobar", "b": /.+/ })
Som också kommer att använda sparse index och bara titta på de där "b" definierades.
För "matriser" sedan "var försiktig". Eftersom värdet som tittas på förmodligen är ett av ovanstående om du inte gjorde detta:
db.collection.insert({ "a": 1, "b": [[]] })
Var då detta är okej:
db.ab.find({ "a": 1, "b": { "$type": 4 } })
Men kommer inte riktigt att använda det "glesa" indexet heller av samma anledningar $exists
kommer inte att fungera här.
Så du måste förstå vad termerna betyder här och "fråga på lämpligt sätt" för att använda indexdefinitionerna som du skapar om du förväntar dig maximal prestanda.
Det här är tydliga exempel som du kan testa själv och se att resultaten är sanna. Jag önskar att kärndokumentationen var tydligare på dessa punkter, men jag är också medveten om att många har försökt bidra (och har producerat utmärkta förklaringar) men ingen av dessa har inkluderats hittills.
Antar att det är därför du frågar här.