📚 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.

🍃 Modelagem NoSQL Polimórfica & Aggregations no MongoDB

v2.0 — Esquemas Dinâmicos, Documentos Embutidos e Pipelines Analíticos

Trilha de Engenharia de Dados & Bancos de Dados — Projeto 2 de 4

🎓 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.


🎯 Objetivo

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.


🏗️ Estrutura do Documento Polimórfico BSON

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

🧑‍💼 Fase 1 — Levantamento de Requisitos

O Briefing do Cliente (Equipe de Catálogo e Produtos)

“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.”

Requisitos Funcionais (RF) e Não-Funcionais (RNF)

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

📋 Fase 2 — Backlog & User Stories

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

🌿 Fase 3 — Engenharia em Equipe (Git Flow & Setup)

# 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

🛠️ Fase 4 — Implementação Passo a Passo

1. Ingestão do Esquema Polimórfico (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 });

2. Aggregation Pipeline Analítico (aggregation.js)

db.produtos.aggregate([
  { $unwind: "$avaliacoes" },
  { 
    $group: { _id: "$categoria",
      mediaGeralAvaliacoes: { $avg: "$avaliacoes.nota" },
      totalAvaliacoesRecebidas: { $sum: 1 } } }, {$sort: { mediaGeralAvaliacoes: -1 } }
]);

🧭 Decisões Técnicas (ADRs)


🚀 Como Executar no Laboratório

1. Abra o terminal na pasta deste projeto

No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:

cd db_nosql_02_mongodb_ecommerce

2. Execute a aplicação ou testes

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


🧪 Testes de Validação & Asserções

// 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');

✅ Checkpoint Final

  1. O catálogo polimórfico aceita produtos de diferentes tipos sem quebra de esquema.
  2. O Aggregation Pipeline desdobra arrays via $unwind e agrega médias via $group.
  3. Os índices multikey evitam varreduras completas de coleção (COLLSCAN).
  4. Suíte de testes automatizados com 100% de aprovação.
  5. Docker Compose pronto para reprodução imediata.

⬅️ Ver Todos os Projetos no Super-Hub 🏠 Página Inicial do Portal