RESPOSTA DE 2019
Esta resposta é para o MongoDB 4.2
Depois de ler a pergunta e a discussão entre vocês, acredito que o problema foi resolvido, mas ainda a otimização é um problema comum para todos que estão usando o MongoDB.
Eu enfrentei o mesmo problema e aqui estão as dicas para otimização de consultas.
Corrija-me se eu estiver errado :)
1. Adicionar índice na coleção
Os índices desempenham um papel vital na execução rápida de consultas, pois os índices são estruturas de dados que podem armazenar o conjunto de dados da coleção em um formato fácil de percorrer. As consultas são executadas de forma eficiente com a ajuda de índices no MongoDB.
Você pode criar um tipo diferente de índices de acordo com sua necessidade. Saiba mais sobre índices aqui, a documentação oficial do MongoDB.
2. Otimização de pipeline
- Sempre use $match antes de $project , pois os filtros removem documentos e campos extras do próximo estágio.
- Lembre-se sempre, índices são usados por $match e $sort . Portanto, tente adicionar um índice aos campos nos quais você classificará ou filtrará documentos.
- Tente manter essa sequência em sua consulta, use $sort antes de $limit como $sort + $limit + $skip. Porque $sort aproveita o índice e permite que o MongoDB selecione o plano de consulta necessário durante a execução da consulta.
- Sempre use $limit antes de $skip para que esse pulo seja aplicado para limitar os documentos.
- Usar $project para retornar apenas os dados necessários na próxima etapa.
-
Sempre crie um índice nos atributos ForeignField em um $lookup . Além disso, como a pesquisa produz uma matriz, geralmente a desenrolamos no próximo estágio. Então, em vez de desenrolá-lo no próximo estágio, desenrole-o dentro da pesquisa como:
{ $lookup: { from: "Collection", as: "resultingArrays", localField: "x", foreignField: "y", unwinding: { preserveNullAndEmptyArrays: false }
}}
-
Use allowDiskUse na agregação, com a ajuda dela, as operações de agregação podem gravar dados no subdiretório _tmp no diretório Database Path. Ele é usado para realizar a consulta grande no diretório temporário. Por exemplo:
db.orders.aggregate( [ { $match: { status: "A" } }, { $group: { _id: "$uid", total: { $sum: 1 } } }, { $sort: { total: -1 } } ], { allowDiskUse: true }, )
3. Reconstrua os índices
Se você estiver criando e excluindo índices com bastante frequência, reconstrua seus índices. Isso ajuda o MongoDB a atualizar, o plano de consulta armazenado anteriormente no cache, que continua assumindo o plano de consulta necessário, acredite, esse problema é péssimo :(
4. Remova índices indesejados
Muitos índices levam muito tempo na operação Criar, Atualizar e Excluir, pois eles precisam criar o índice junto com suas tarefas. Então, removê-los ajuda muito.
5. Limitando documentos
Em um cenário do mundo real, buscar dados completos presentes no banco de dados não ajuda. Além disso, você não pode exibi-lo ou o usuário não pode ler os dados obtidos completos. Portanto, em vez de buscar dados completos, busque dados em partes que ajudam você e seu cliente a observar esses dados.
E, por último, observar qual plano de execução é selecionado pelo MongoDB ajuda a descobrir o problema principal. Portanto, $explain o ajudará a descobrir isso.
Espero que este resumo ajude vocês, sintam-se à vontade para sugerir novos pontos se eu perder algum. Vou adicioná-los também.