O que você parece não estar entendendo aqui é que
$exists
não pode "pegar" um índice de forma alguma, mesmo quando esparso. Como a própria documentação diz:O exemplo dado nessas páginas é um
{ "$exists": false }
consulta. Mas a condição lógica inversa não faz diferença aqui. Para obter o "benefício total" de um índice "esparso", você precisa considerar o "tipo" de dados que ele contém e consultar adequadamente.
Para numérico, algo como:
db.collection.find({ "a": "foobar", "b": { "$gte": -9999, "$lte": 9999 } })
Que usa um índice e o esparso. Ou para texto baseado:
db.collection.find({ "a": "foobar", "b": /.+/ })
Que também usará o índice esparso e observará apenas aqueles em que "b" foi definido.
Para "arrays", então "tenha cuidado". Como o valor que está sendo analisado é provavelmente um dos acima, a menos que você tenha feito isso:
db.collection.insert({ "a": 1, "b": [[]] })
Onde então está tudo bem:
db.ab.find({ "a": 1, "b": { "$type": 4 } })
Mas não vai realmente usar o índice "esparso" pelos mesmos motivos
$exists
não vai funcionar aqui. Portanto, você precisa entender o que os termos significam aqui e "consultar adequadamente" para usar as definições de índice que você cria se espera o desempenho máximo.
Estes são exemplos claros que você pode testar por si mesmo e ver que os resultados são verdadeiros. Eu gostaria que a documentação principal fosse mais clara sobre esses pontos, mas também estou ciente de que muitos tentaram contribuir (e produziram excelentes explicações), mas nenhum deles foi incluído até o momento.
Acho que é por isso que você está perguntando aqui.