MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Índices compostos ideais para $exists :true (índices esparsos)


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.