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

Mongodb Explicar para a estrutura de agregação


A partir do MongoDB versão 3.0, simplesmente alterando a ordem de
collection.aggregate(...).explain()

para
collection.explain().aggregate(...)

lhe dará os resultados desejados (documentação aqui).

Para versões mais antigas>=2.6, você precisará usar o explain opção para operações de pipeline de agregação

explain:true

db.collection.aggregate([
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { $group: { 
        _id : "$_id",
        count: { $sum:1 } 
    }},
    {$sort: {"count":-1}}
  ],
  {
    explain:true
  }
)

Uma consideração importante com o Aggregation Framework é que um índice só pode ser usado para buscar os dados iniciais de um pipeline (por exemplo, uso de $match , $sort , $geonear no início de um pipeline), bem como o $lookup subsequente e $graphLookup estágios. Depois que os dados forem buscados no pipeline de agregação para processamento (por exemplo, passando por estágios como $project , $unwind e $group ) manipulação adicional será na memória (possivelmente usando arquivos temporários se o allowDiskUse opção está definida).

Otimização de pipelines


Em geral, você pode otimizar pipelines de agregação:
  • Iniciando um pipeline com um $match etapa para restringir o processamento a documentos relevantes.
  • Garantindo o $match inicial / $sort estágios são suportados por um índice eficiente.
  • Filtrar dados antecipadamente usando $match , $limit e $skip .
  • Minimizando etapas desnecessárias e manipulação de documentos (talvez reconsiderando seu esquema se forem necessárias ginásticas de agregação complicadas).
  • Aproveitando os operadores de agregação mais recentes se você atualizou seu servidor MongoDB. Por exemplo, o MongoDB 3.4 adicionou muitos novos estágios e expressões de agregação, incluindo suporte para trabalhar com arrays, strings e facetas.

Há também uma série de Otimizações de Pipeline de Agregação que acontecem automaticamente dependendo da versão do seu servidor MongoDB. Por exemplo, estágios adjacentes podem ser agrupados e/ou reordenados para melhorar a execução sem afetar os resultados de saída.

Limitações


Como no MongoDB 3.4, o Aggregation Framework explain A opção fornece informações sobre como um pipeline é processado, mas não oferece suporte ao mesmo nível de detalhes que o executionStats modo para um find() inquerir. Se você estiver focado em otimizar a execução da consulta inicial, provavelmente achará benéfico revisar o equivalente find().explain() consulta com executionStats ou allPlansExecution verbosidade.

Existem algumas solicitações de recursos relevantes para assistir/aprovar no rastreador de problemas do MongoDB em relação a estatísticas de execução mais detalhadas para ajudar a otimizar/perfil de pipelines de agregação:
  • SERVER-19758:adicione os modos de explicação "executionStats" e "allPlansExecution" à explicação de agregação
  • SERVER-21784:acompanhe as estatísticas de execução para cada estágio do pipeline de agregação e exponha por meio de explicação
  • SERVER-22622:Melhore a explicação de $lookup para indicar o plano de consulta na coleção "de"