Agregação no MongoDB é uma ferramenta que permite a manipulação e análise de dados de forma flexível e eficiente. Isso, porque o aumento exponencial de dados armazenados em banco de dados NoSQL, exige uma ferramenta capaz de realizar consultas complexas, transformando e processando dados de maneira eficiente.
De acordo com a própria documentação do MongoDB você pode usar operações de agregação para: i) Agrupar valores de vários documentos; ii) Executar operações nos dados agrupados para retornar um único resultado e iii) Analisar as mudanças dos dados ao longo do tempo.
Vamos exemplificar a Agregação com um banco de dados de Pokémon?
Os dados desse arquivo vou deixar ao final do artigo com o Link no repositório do GitHub para caso você queira treinar. Vale ressaltar que o exercício foi feito com base no curso do Renan Pallin, (disponível na Udemy). Vamos para o exemplo:
Possuímos um banco de dados com duas coleções, uma coleção de pokémons: com mais de 800 deles, e cada um tem as suas skills (e outras de combates, que estarão em um próximo artigo):
Na imagem, podemos observar o nome do pokémon, o seu ID, seu tipo e suas habilidades.
Nesse primeiro momento, antes de entrar de fato em uma resolução de problema, vou lhe apresentar algumas informações importantes sobre agregação.
Explicando o conceito de Pipelines
O pipeline de agregação no MongoDB é uma sequência de etapas que você pode usar para processar dados e realizar operações. Cada etapa do pipeline é representada por um operador de agregação, tudo o que precisamos fazer é montar a composição do nosso pipeline.
Lembre-se, pipelines devem sempre estar em uma lista de estágios, e estágios são compostos por um ou mais operador de agregação ou expressões. Abaixo, um exemplo da própria documentação do MongoDB
O exemplo de pipeline contém dois estágios e retorna à quantidade total do pedido de pizzas de tamanho médio, agrupados por nome de pizza.
Esse retorno acontece devido as operações e expressões utilizadas, $match e $group.
Principais estágios de um pipeline de dados
$match:
· Livre para usar quantas vezes forem necessárias no seu pipeline;
· É o primeiro estágio do seu pipeline,
· $match usa a mesma consulta que find().
$project:
· Passa os documentos com os campos solicitados para a próxima etapa do pipeline.
As especificações do Project têm as seguintes formas:
o <campo> : 1 ou true : Especifica a inclusão do campo.
o id: 0 ou false: Especifica a supressão do campo id.
o <campo>: <expression.>: Adiciona um novo campo, ou redefine o valor de um campo existente.
o <campo>: 0 ou false: Especifica a exclusão de um campo.
Por exemplo, vamos supor que possuímos uma coleção de alunos que estão separados por setor de interesse.
Estamos fazendo um filtro, no primeiro estágio, usando o $match de todos que estão alocados na turma de Engenharia de Dados, e a segunda parte desse pipeline é um $project onde vamos exibir somente o nome e se a matrícula está ativa.
A agregação é uma ferramenta muito útil para realizar operações complexas. Outro operador que já apareceu aqui mas ainda não o expliquei é o $group.
$group:
· Essa etapa separa os documentos em grupos de acordo com uma “chave”
Como no exemplo da pizzaria, em que foi feito um agrupamento de nome de pizza, e quantidades de pedidos.
$sort:
· Classifica todos os documentos de entrada e os retorna ao pipeline na ordem da classificação.
· $sort pega um documento que especifica os campos para classificar e a respectiva ordem da classificação, sendo 1 ascendente, e -1 descrescente.
$limit:
· Limita o número de documentos passados para o próximo estágio no pipeline.
$skip:
· Ignora o número especificado de documentos que passam para o estágio e passa os documentos restantes para o próximo estágio no pipeline.
$lookup:
· O $lookup permite combinar documentos de duas coleções diferentes com base em um campo em comum, criando um resultado enriquecido com dados de ambas as coleções.
· O $lookup tem a seguinte sintaxe:
Operadores de um pipeline de dados:
Abaixo serão apresentados alguns, de muitos, e para ter acesso a todos entre na documentação. Os operadores de agregação são usados dentro dos estágios de agregação para moldar o pipeline de agregação.
$max:
· O operador $max é usado para determinar o valor mais alto de um campo em uma coleção durante uma operação de agregação. Ele retorna o documento que possui o valor máximo para o campo especificado.
$min:
· Ao contrário do $max, este retorna o valor mínimo.
$sum:
· Calcula e retorna a soma coletiva de valores numéricos.
Resolvendo o problema:
Bom, nós temos a coleção “pokemmons” e os documentos são apresentados da seguinte maneira:
Agora, nosso objetivo é apresentar o seguinte resultado: a contagem total de pokémons por geração (disponíveis nas gerações 1ª a 6ª) e a média de habilidades desses pokémons. Para isso, vamos iniciar com uma categorização, na qual reuniremos informações sobre: Geração, Contagem total de pokémons na geração e Média de habilidades entre as gerações.
O campo _id é definido como $generation, o que significa que os documentos serão agrupados com base no valor do campo "Generation". O operador $sum é utilizado para calcular a soma de 1 para cada documento agrupado.
Quanto à média de ataque, é feita a soma das habilidades e, em seguida, calculada a média entre elas.
E essa segunda parte é o $project, o mais interessante é a forma como vamos projetor o _id como geração, e mostraremos a SomaDaGeracao e MediaAtaque.
E o retorno é o seguinte:
Muito bacana, certo?
Assim, conseguimos ver a média de ataque de cada geração, até poderia dizer que por essas métricas a geração 4 tem a maior média de força de ataque, mas é interessante considerar que também estamos falando que tem uma diferença entre as quantidades de pokémons por geração.
Para um próximo artigo, vamos trabalhar e mostrar mais explicitamente como a modelagem de dados é importante e faria diferença nesse banco. E para agregar a esse tema, vamos falar de $lookup. Mas, como disse, fica para uma próxima.
REFERÊNCIAS
MongoDB. Aggregation Pipeline Stages. Disponível em < https://www.mongodb.com/docs/manual/reference/operator/aggregation-pipeline/>
MongoDB. Aggregation Pipeline Operators. Disponível em < https://www.mongodb.com/docs/manual/reference/operator/aggregation/>
Udemy. Curso completo MongoDB 2022, Renan Palin. Disponível em < https://www.udemy.com/course/mongodb-curso-completo/>
Dataset Pokemon. Disponível em <https://www.kaggle.com/datasets/terminus7/pokemon-challenge>