Aggregation Pipeline
Aggregation Pipeline
Aggregation Pipeline é um recurso incrível do MongoDB, com ela podemos selecionar e transformar dados de forma semelhante à instruções SQL.
Escreverei uma série de artigos sobre Aggegation Pipeline, aqui eu somente irei apresentar o conceito básico e alguns exemplos simples, nos próximos cada tópico será mais aprofundado.
Para que você consiga executar os exemplos eu preparei um repositório com um arquivo docker compose para rodar o MongoDB e também com o backup dos bancos de exemplo. Dê uma olhada no arquivo README. MongoDB Samples
Banco utilizado para executar os exemplos
Para esse artigo eu vou utilizar o banco sample_airbnb do repositório mongo-samples.
Estágios
Uma Aggregation Pipeline é construída por vários estágios, a saída do estágio anterior será a entrada do próximo estágio
Uma Aggregation Pipeline com dois estágios teria essa estrutura:
db.getCollection('listingsAndReviews').aggregate(
[
{},
{}
]
)
Estágios de Transformação
project - Seleciona, renomeia, inclui/exclui campos. Pode incluir computações. addFields - Adiciona novos campos ou sobrescreve campos existentes. set - Alias de addFields. unset - Remove campos de documentos. replaceRoot - Substitui o documento atual por um subdocumento. replaceWith - Alias de replaceRoot.
Estágios de Filtro
match - Filtra documentos (como um WHERE no SQL). limit - Limita o número de documentos. skip - Pula os primeiros N documentos. redact - Controla o acesso a partes sensíveis do documento com base em lógica condicional.
Estágios de Agrupamento e Estatísticas
group - Agrupa documentos por uma chave e aplica acumuladores ($sum, $avg, $max, etc). count - Conta o número de documentos passando pela pipeline. bucket - Agrupa documentos por intervalo. bucketAuto - Similar ao $bucket, mas define automaticamente os intervalos. sortByCount - Agrupa e ordena por frequência (equivalente a $group + $sort).
Estágios de Ordenação
sort - Ordena os documentos com base em um ou mais campos.
Estágios de Junção (Join)
lookup - Faz junção com outra coleção. graphLookup - Recursivamente busca documentos relacionados (busca em grafos).
Estágios de Agrupamento em Arrays
unwind - “Desconstrói” arrays — cria um documento para cada elemento do array. facet - Executa múltiplas pipelines paralelas nos mesmos dados.
Estágios de Saída
merge - Insere/atualiza os resultados em outra coleção. out - Substitui completamente uma coleção pelos resultados.
Exemplos
Match
Aqui temos um exemplo simples com Aggregation Pipeline com somente um estágio usando match para filtrar somente os documentos com o campo year igual à 1998.
db.getCollection('movies').aggregate(
[
{
$match: { year: 1998 }
}
]
)
Match e Sort
Aqui temos um exemplo utilizando dois estágios, um estágio match para filtrar os documentos com o campo year igual à 1998, e um estágio sort para ordenar os documentos pelo campo runtime:
db.getCollection('movies').aggregate(
[
{
$match: { year: 1998 }
},
{
$sort: { runtime: 1 }
}
]
)
Para ordernar em ordem ascendete utilize 1
Para ordernar em ordem descendente utilize -1
Se você executar o exemplo acima você irá notar que os primeiros documentos não possuem o campo runtime o comportamento do MongoDB nesses casos em que os documentos não possuem o campo desejado para a ordenação é o seguinte:
Quando ordenado de forma ascendente 1 serão colocados primeiro
Quando ordenado de forma descendente -1 serão colocados por último
Nos próximos artigos irei dar mais exemplos de operações com Aggregation Pipeline