📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Módulo 08: Bancos de Dados SQL e NoSQL. Recomendado revisar antes de começar.
v2.0 — Esquemas Dinâmicos, Documentos Embutidos e Pipelines Analíticos
Trilha de Engenharia de Dados & Bancos de Dados — Projeto 2 de 4
- v1: Modelagem Relacional 3FN · Constraints · Triggers · PostgreSQL 16
- ➡️ v2 (este): Modelagem NoSQL · Aggregation Pipelines · Índices Multikey · MongoDB 7.0
- v3: Estratégias de Cache · Cache-Aside · Invalidação · Redis 7.2
- v4: DBA Enterprise · EXPLAIN ANALYZE · Particionamento · PgBouncer · RLS
🎓 Nível Profissional Simulado: Engenheiro de Software Pleno / Data Engineer. Modelagem NoSQL não é “jogar JSON sem regras”. Um engenheiro sênior sabe decidir com precisão matemática entre Embedding (embutir para alta leitura atômica) vs Referencing (referenciar para evitar documentos acima de 16MB) e constrói aggregation pipelines de alta performance.
Modelar e implementar uma base NoSQL orientada a documentos para o catálogo polimórfico de um e-commerce no MongoDB 7.0, utilizando documentos aninhados, criação de índices compostos e multikey, e execução de um Aggregation Pipeline para cálculo analítico de métricas de satisfação e vendas.
graph TD
classDef root fill:#00684A,stroke:#001E2B,stroke-width:2px,color:#fff;
classDef branch fill:#023430,stroke:#00ED64,stroke-width:1px,color:#fff;
classDef leaf fill:#13AA52,stroke:#001E2B,stroke-width:1px,color:#fff;
Doc["📦 Documento Produto (_id, nome, categoria, preco)"]:::root
Doc --> Tags["🏷️ tags: Array<string> (Multikey Index)"]:::branch
Tags --> T1["'tv'"]:::leaf
Tags --> T2["'oled'"]:::leaf
Tags --> T3["'4k'"]:::leaf
Doc --> Specs["⚙️ especificacoes: Object (Polimórfico)"]:::branch
Specs --> S1["resolucao: '3840x2160'"]:::leaf
Specs --> S2["portas_hdmi: 4"]:::leaf
Doc --> Reviews["⭐ avaliacoes: Array<Object> (Embedded)"]:::branch
Reviews --> R1["{ usuario: 'carlos@email.com', nota: 5, comentario: '...' }"]:::leaf
Reviews --> R2["{ usuario: 'ana@email.com', nota: 4, comentario: '...' }"]:::leaf
“Nosso e-commerce vende desde celulares até roupas e livros. No banco relacional antigo, cada categoria nova exigia alterar tabelas ou criar tabelas extras de atributos (EAV), o que deixava as consultas cheias de JOINs lentos. Além disso, queremos que cada produto guarde suas próprias avaliações de clientes e suas tags de busca, e precisamos de um relatório analítico que calcule a nota média e o total de produtos por categoria sem travar o banco.”
| ID | Tipo | Descrição | Origem no Briefing |
|---|---|---|---|
| RF01 | Funcional | Permitir armazenamento de produtos com especificações técnicas heterogêneas no mesmo catálogo. | “vende desde celulares até roupas” |
| RF02 | Funcional | Armazenar avaliações de clientes embutidas (embedded) dentro do próprio documento do produto. | “guarde suas próprias avaliações” |
| RF03 | Funcional | Permitir buscas textuais e por tags com índices multikey. | “tags de busca” |
| RF04 | Funcional | Gerar relatório consolidado de nota média e total de avaliações por categoria via Aggregation Pipeline. | “relatório analítico de nota média” |
| RNF01 | Não-Funcional | Leitura do produto completo em 1 único round-trip de I/O de disco (sem JOINs). | Performance NoSQL |
| RNF02 | Não-Funcional | Esquema polimórfico dinâmico compatível com MongoDB 7.0. | Flexibilidade de Schema |
| ID | User Story | Prioridade |
|---|---|---|
| US01 | Como lojista, quero cadastrar produtos com especificações dinâmicas sem precisar rodar migrações DDL. | Alta |
| US02 | Como cliente, quero avaliar um produto com nota e comentário persistidos atomicamente. | Alta |
| US03 | Como usuário, quero buscar produtos instantaneamente por tags através de índices multikey. | Média |
| US04 | Como analista de BI, quero executar pipelines de agregação para ranking de categorias mais bem avaliadas. | Alta |
# Branch da funcionalidade
git checkout -b feature/US04-aggregation-pipeline
# Subir o MongoDB isolado via Docker
docker-compose up -d
# Conectar via Mongosh
docker exec -it db_nosql_mongo mongosh -u admin -p secretpassword --authenticationDatabase admin
scripts/01_init.js)db.produtos.insertMany([
{
_id: "PROD-001",
nome: "Smart TV 55 4K OLED",
categoria: "Eletrônicos",
preco: 4299.00,
tags: ["tv", "oled", "4k", "gamer"],
especificacoes: { resolucao: "3840x2160", portas_hdmi: 4 },
avaliacoes: [
{ usuario: "carlos@email.com", nota: 5, comentario: "Imagem incrível!" }
]
}
]);
// Índices Multikey em arrays
db.produtos.createIndex({ tags: 1 });
aggregation.js)db.produtos.aggregate([
{ $unwind: "$avaliacoes" },
{
$group: { _id: "$categoria",
mediaGeralAvaliacoes: { $avg: "$avaliacoes.nota" },
totalAvaliacoesRecebidas: { $sum: 1 } } }, {$sort: { mediaGeralAvaliacoes: -1 } }
]);
No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:
cd db_nosql_02_mongodb_ecommerce
docker-compose up -d
# Executar a suíte de testes automatizados localmente:
python -m unittest tests/test_nosql_ecommerce.py
[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar:
cd proj_aplicacoes_full_stack/projetos/db_nosql_02_mongodb_ecommerce
// 1. Validar se o índice de tags é utilizado (deve retornar IXSCAN)
db.produtos.find({ tags: "gamer" }).explain("executionStats");
// 2. Executar o pipeline de agregação
load('/scripts/../aggregation.js');
- O catálogo polimórfico aceita produtos de diferentes tipos sem quebra de esquema.
- O Aggregation Pipeline desdobra arrays via
$unwinde agrega médias via$group.- Os índices multikey evitam varreduras completas de coleção (
COLLSCAN).- Suíte de testes automatizados com 100% de aprovação.
- Docker Compose pronto para reprodução imediata.
| ⬅️ Ver Todos os Projetos no Super-Hub | 🏠 Página Inicial do Portal |