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

Classificando em vários campos mongo DB


O otimizador de consulta do MongoDB funciona tentando diferentes planos para determinar qual abordagem funciona melhor para uma determinada consulta. O plano vencedor para esse padrão de consulta é armazenado em cache para as próximas ~1.000 consultas ou até que você faça um explain() .

Para entender quais planos de consulta foram considerados, você deve usar explain(1) , por exemplo:
db.col.find({category:'A'}).sort({updated: -1}).explain(1)

Os allPlans detalhe mostrará todos os planos que foram comparados.

Se você executar uma consulta que não é muito seletiva (por exemplo, se muitos registros corresponderem aos seus critérios de {category: { $ne:'A'}} ), pode ser mais rápido para o MongoDB encontrar resultados usando um BasicCursor (varredura de tabela) em vez de corresponder a um índice.

A ordem dos campos na consulta geralmente não faz diferença para a seleção do índice (há algumas exceções com consultas de intervalo). A ordem dos campos em uma classificação afeta a seleção do índice. Se o seu sort() os critérios não correspondem à ordem do índice, os dados do resultado devem ser reordenados após o índice ser usado (você deverá ver scanAndOrder:true na saída de explicação se isso acontecer).

Também vale a pena notar que o MongoDB usará apenas um índice por consulta (com exceção de $or s).

Então, se você está tentando otimizar a consulta:
db.col.find({category:'A'}).sort({updated: -1, rating: -1})

Você desejará incluir todos os três campos no índice:
db.col.ensureIndex({category: 1, updated: -1, rating: -1})

Para sua informação, se você deseja forçar uma consulta específica a usar um índice (geralmente não necessário ou recomendado), existe uma hint() opção que você pode tentar.