Zdá se, že zde nerozumíte tomu, že $exists
nemůže žádným způsobem "uchopit" index, ani tam, kde je řídký. Jak říká samotná dokumentace:
Příklad uvedený na těchto stránkách je { "$exists": false }
dotaz. Ale obrácená logická podmínka zde nehraje žádný rozdíl.
Abyste získali „plný přínos“ „řídkého“ indexu, musíte zvážit „typ“ dat, která obsahuje, a vhodně se dotazovat.
Pro numerické něco jako:
db.collection.find({ "a": "foobar", "b": { "$gte": -9999, "$lte": 9999 } })
Který používá index, a ten řídký. Nebo pro textové:
db.collection.find({ "a": "foobar", "b": /.+/ })
Což také použije řídký index a podívá se pouze na ty, kde bylo definováno "b".
U „polí“ pak „buďte opatrní“. Protože sledovaná hodnota je pravděpodobně jedna z výše uvedených, pokud jste neudělali toto:
db.collection.insert({ "a": 1, "b": [[]] })
Kde je to tedy v pořádku:
db.ab.find({ "a": 1, "b": { "$type": 4 } })
Ale opravdu nebude používat "řídký" index ze stejných důvodů $exists
zde nebude fungovat.
Musíte tedy porozumět tomu, co zde tyto pojmy znamenají, a „vhodně se dotazovat“, abyste mohli použít definice indexu, které vytvoříte, pokud očekáváte maximální výkon.
Toto jsou jasné příklady, které si můžete sami vyzkoušet a uvidíte, že výsledky jsou pravdivé. Přál bych si, aby základní dokumentace byla v těchto bodech jasnější, ale také jsem si vědom toho, že se mnozí pokusili přispět (a vytvořili vynikající vysvětlení), ale žádná z nich nebyla dosud zahrnuta.
Hádám, že proto se ptáte zde.