A partir do MongoDB versão 3.0, basta alterar a ordem de
collection.aggregate(...).explain()
para
collection.explain().aggregate(...)
fornecerá os resultados desejados (documentação aqui ).
Para versões mais antigas> = 2.6, você precisará usar a 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 Quadro A agregação é um índice que só pode ser usado para obter os dados iniciais de um oleoduto (por exemplo, o uso de $match
, $sort
, $geonear
no início de um oleoduto), bem como subsequente $lookup
e $graphLookup
fases. Uma vez que os dados tenham sido buscados no pipeline de agregação para processamento (por exemplo, passando por estágios como $project
, $unwind
e $group
), a manipulação adicional estará na memória (possivelmente usando arquivos temporários se a allowDiskUse
opção for definida).
Otimizando pipelines
Em geral, você pode otimizar pipelines de agregação por:
- Iniciar um pipeline com um
$match
estágio para restringir o processamento de documentos relevantes.
- Assegurar as iniciais
$match
/ $sort
fases são suportados por um índice eficiente .
- Filtrando dados cedo usando
$match
, $limit
e $skip
.
- Minimizando estágios desnecessários e manipulação de documentos (talvez reconsiderando seu esquema se uma complicada ginástica de agregação for necessária).
- Aproveitando os novos operadores de agregação se você atualizou seu servidor MongoDB. Por exemplo, MongoDB 3.4 adicionou muitos novos estágios de agregação e expressões, incluindo suporte para trabalhar com arrays, strings e facetas.
Também há várias otimizações de pipeline de agregação que acontecem automaticamente, dependendo da versão do servidor MongoDB. Por exemplo, estágios adjacentes podem ser coalescidos e / ou reordenados para melhorar a execução sem afetar os resultados de saída.
Limitações
Como no MongoDB 3.4, a explain
opção Aggregation Framework fornece informações sobre como um pipeline é processado, mas não oferece suporte ao mesmo nível de detalhe que o executionStats
modo para uma find()
consulta. Se você estiver focado na otimização da execução inicial da consulta, provavelmente achará benéfico revisar a find().explain()
consulta equivalente com executionStats
ou allPlansExecution
detalhamento .
Existem algumas solicitações de recursos relevantes para observar / votar no rastreador de problemas do MongoDB em relação a estatísticas de execução mais detalhadas para ajudar a otimizar / canais de agregação de perfil:
$sort
objeto não deveria estar dentro da matriz do pipeline?explain
limitações do Aggregation Framework , bem como solicitações de recursos relevantes para estatísticas de execução adicionais.A partir da versão 2.6.x, o mongodb permite que os usuários façam explicações com a estrutura de agregação .
Tudo que você precisa fazer é adicionar explain: true
Graças ao Rafa, sei que foi possível fazer até no 2.4, mas só através
runCommand()
. Mas agora você pode usar agregado também.fonte
db.collection.runCommand('aggregate', {pipeline: [PIPELINE], explain: true})
desde o MongoDB 2.2.A estrutura de agregação é um conjunto de ferramentas analíticas
MongoDB
que nos permite executar vários tipos de relatórios ou análises em documentos em uma ou mais coleções. Baseado na ideia de um pipeline. Recebemos a entrada de umaMongoDB
coleção e passamos os documentos dessa coleção por um ou mais estágios, cada um dos quais executa uma operação diferente em suas entradas. Cada estágio recebe como entrada qualquer que seja o estágio antes de ser produzido como saída. E as entradas e saídas de todos os estágios são um fluxo de documentos. Cada estágio tem um trabalho específico que faz. Ele está esperando uma forma específica de documento e produz uma saída específica, que é um fluxo de documentos. No final do pipeline, temos acesso à saída.Um estágio individual é uma unidade de processamento de dados. Cada estágio recebe como entrada um fluxo de documentos um por vez, processa cada documento um por vez e produz o fluxo de saída de documentos. Novamente, um de cada vez. Cada estágio fornece um conjunto de botões ou sintonizadores que podemos controlar para parametrizar o estágio para realizar qualquer tarefa que estivermos interessados em fazer. Portanto, um estágio executa uma tarefa genérica - uma tarefa de propósito geral de algum tipo e parametriza o estágio para o conjunto específico de documentos com o qual estamos trabalhando. E exatamente o que gostaríamos que essa etapa fizesse com esses documentos. Esses ajustáveis normalmente assumem a forma de operadores que podemos fornecer que modificarão campos, realizarão operações aritméticas, remodelarão documentos ou realizarão algum tipo de tarefa de acumulação, bem como uma série de outras coisas. Muitas vezes, é o caso de nós '
Por exemplo, podemos desejar realizar um filtro inicial para que não tenhamos que passar a coleção inteira em nosso pipeline. Mas, mais tarde, após algum processamento adicional, deseja filtrar mais uma vez usando um conjunto diferente de critérios. Portanto, para recapitular, o pipeline funciona com uma
MongoDB
coleção. Eles são compostos de estágios, cada um dos quais executa uma tarefa de processamento de dados diferente em sua entrada e produz documentos como saída para serem passados para o próximo estágio. E, finalmente, no final da saída do pipeline é produzida que podemos fazer algo dentro de nosso aplicativo. Em muitos casos, é necessário incluir o mesmo tipo de estágio, várias vezes em um pipeline individual.fonte