Ícone do site dfilitto

Projeto Guiado de Agregação no MongoDB

O que é o mongoDB

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:

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:

  1. Total de pedidos por status.
  2. Receita total por cliente.
  3. 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.

Sair da versão mobile