Hvad du tilsyneladende ikke forstår her er, at $exists
kan ikke "gribe" et indeks på nogen måde, selv hvor sparsomt. Som dokumentationen selv siger:
Eksemplet på disse sider er en { "$exists": false }
forespørgsel. Men den omvendte logiske betingelse gør ikke nogen forskel her.
For at få det "fulde udbytte" af et "sparsomt" indeks, skal du overveje den "type" data, det indeholder, og forespørge på passende vis.
For numerisk noget som:
db.collection.find({ "a": "foobar", "b": { "$gte": -9999, "$lte": 9999 } })
Som bruger et indeks, og det sparsomme. Eller for tekstbaseret:
db.collection.find({ "a": "foobar", "b": /.+/ })
Som også vil bruge det sparsomme indeks og kun se på dem, hvor "b" blev defineret.
For "arrays" så "vær forsigtig". Da den værdi, der kigges på, sandsynligvis er en af ovenstående, medmindre du gjorde dette:
db.collection.insert({ "a": 1, "b": [[]] })
Hvor så er det i orden:
db.ab.find({ "a": 1, "b": { "$type": 4 } })
Men kommer egentlig heller ikke til at bruge "sparse" indekset af de samme grunde $exists
virker ikke her.
Så du skal forstå, hvad begreberne betyder her, og "forespørge passende" for at bruge de indeksdefinitioner, du opretter, hvis du forventer den maksimale ydeevne.
Dette er klare eksempler, du selv kan teste og se, at resultaterne er sande. Jeg ville ønske, at kernedokumentationen var klarere på disse punkter, men jeg er også klar over, at mange har forsøgt at bidrage (og har produceret fremragende forklaringer), men ingen af disse er blevet inkluderet til dato.
Det er vel derfor, du spørger her.