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