O objetivo deste material é ensinar a agregação em MongoDB de uma forma prática e interativa, utilizando um projeto guiado. Ao final, os alunos estarão familiarizados com o uso de pipelines de agregação e operações como $match
, $group
, $project
, $sort
, $limit
, $unwind
, entre outros.
Projeto Guiado de Agregação no MongoDB
A agregação é uma forma poderosa de realizar consultas complexas em coleções no MongoDB, semelhante a funções de SQL como GROUP BY, SUM, AVG, COUNT. Ela permite processar grandes volumes de dados e retornar resultados transformados e resumidos.
Como funciona o Pipeline de Agregação
O pipeline de agregação funciona como uma sequência de estágios onde cada estágio recebe documentos como entrada, os processa e passa os resultados para o próximo estágio.
Exemplo de um pipeline:
[
{ $match: { status: "ativo" } },
{ $group: { _id: "$categoria", total: { $sum: 1 } } },
{ $sort: { total: -1 } }
]
Instruções para o Projeto
1. Pré-requisitos
Certifique-se de que:
- O MongoDB esteja instalado e em execução.
- O MongoDB Compass (ou outro cliente) esteja configurado.
- Você já tenha criado um banco de dados e coleções antes.
Não sabe por onde começar? Basta assistir a playlist a seguir para aprender tudo sobre MongoDB.
2. Dataset Utilizado
Vamos utilizar um dataset fictício chamado “ecommerce”, com uma coleção chamada “orders”. Insira os documentos abaixo utilizando o comando insertMany
.
db.orders.insertMany([
{ "orderId": 1, "customerName": "João", "amount": 120, "status": "completed", "items": ["Laptop", "Mouse"], "orderDate": new Date("2024-01-12") },
{ "orderId": 2, "customerName": "Maria", "amount": 250, "status": "pending", "items": ["Tablet", "Keyboard"], "orderDate": new Date("2024-02-15") },
{ "orderId": 3, "customerName": "Carlos", "amount": 80, "status": "completed", "items": ["Headphones"], "orderDate": new Date("2024-03-10") },
{ "orderId": 4, "customerName": "Ana", "amount": 300, "status": "completed", "items": ["Monitor", "Mousepad"], "orderDate": new Date("2024-04-20") },
{ "orderId": 5, "customerName": "Pedro", "amount": 150, "status": "pending", "items": ["Smartphone"], "orderDate": new Date("2024-05-02") }
]);
Tarefas Práticas de Agregação
Tarefa 1: Filtrar Pedidos Completados
Objetivo: Usar o estágio $match
para filtrar apenas pedidos com status “completed”.
db.orders.aggregate([
{ $match: { status: "completed" } }
]);
Resultado Esperado: Apenas os pedidos com status: "completed"
serão retornados.
Tarefa 2: Total de Pedidos por Status
Objetivo: Utilizar $group
para contar quantos pedidos estão em cada status.
db.orders.aggregate([
{ $group: { _id: "$status", totalOrders: { $sum: 1 } } }
]);
Explicação: Agrupa os documentos pelo campo status
e conta o total de pedidos em cada grupo.
Tarefa 3: Total de Receita por Cliente
Objetivo: Calcular o total gasto por cada cliente utilizando $group
.
db.orders.aggregate([
{ $group: { _id: "$customerName", totalAmount: { $sum: "$amount" } } },
{ $sort: { totalAmount: -1 } }
]);
Explicação: Agrupa por customerName
e soma o campo amount
, ordenando pelo valor total gasto em ordem decrescente.
Tarefa 4: Pedidos Mais Recentes
Objetivo: Usar $sort
e $limit
para encontrar os 3 pedidos mais recentes.
db.orders.aggregate([
{ $sort: { orderDate: -1 } },
{ $limit: 3 }
]);
Explicação: Ordena os pedidos pela data (orderDate
) em ordem decrescente e retorna apenas os 3 primeiros resultados.
Tarefa 5: Extrair Itens de Pedidos
Objetivo: Usar $unwind
para listar todos os itens de pedidos individualmente.
db.orders.aggregate([
{ $unwind: "$items" },
{ $group: { _id: "$items", totalSold: { $sum: 1 } } }
]);
Explicação: O $unwind
“explode” a lista de itens, criando um documento separado para cada item em um pedido.
Tarefa 6: Análise de Vendas Mensais
Objetivo: Agrupar as vendas por mês utilizando $project
e $group
.
db.orders.aggregate([
{
$project: {
month: { $month: "$orderDate" },
amount: 1
}
},
{
$group: {
_id: "$month",
totalSales: { $sum: "$amount" }
}
},
{ $sort: { _id: 1 } }
]);
Explicação: Extraímos o mês da orderDate
usando $project
, depois agrupamos por mês e somamos os valores de amount
.
Tarefa 7: Calcular Média de Valores de Pedidos
Objetivo: Utilizar $group
e $avg
para calcular a média do valor dos pedidos.
db.orders.aggregate([
{ $group: { _id: null, averageAmount: { $avg: "$amount" } } }
]);
Explicação: Calcula a média de amount
de todos os pedidos.
Desafio Final: Relatório Completo de Vendas
Objetivo: Criar um relatório que contenha:
- Total de pedidos por status.
- Receita total por cliente.
- Listagem dos itens vendidos e suas quantidades.
db.orders.aggregate([
{
$facet: {
totalOrdersByStatus: [
{ $group: { _id: "$status", total: { $sum: 1 } } }
],
revenueByCustomer: [
{ $group: { _id: "$customerName", totalAmount: { $sum: "$amount" } } }
],
itemsSold: [
{ $unwind: "$items" },
{ $group: { _id: "$items", totalSold: { $sum: 1 } } }
]
}
}
]);
Explicação: Utilizamos $facet
para dividir a consulta em várias partes, retornando resultados separados em um único pipeline.
Conclusão
Essas tarefas proporcionam uma visão prática do uso de agregações no MongoDB. O projeto guiado foi projetado para que os alunos desenvolvam um entendimento sólido dos conceitos, ao mesmo tempo que praticam a aplicação desses conceitos em um cenário realista.