Aula 17 - Modelagem Orientada a Documentos com MongoDB 🍃
Objetivo Pedagógico
Objetivo: Arquitetura de modelagem em bancos NoSQL orientados a documentos (MongoDB): Embutir vs. Referenciar (Embedding vs. Referencing), operadores de agregação (Aggregation Pipeline) e particionamento (Sharding).
📑 1. Fundamentos Teóricos & Análise Técnica
Os bancos de dados NoSQL Orientados a Documentos (com destaque para o MongoDB) surgiram para atender à necessidade de escalabilidade horizontal, esquemas dinâmicos (Schemaless) e manipulação natural de estruturas de dados hierárquicas em formato BSON (Binary JSON).
Dilema central da modelagem de documentos: 1. Embutir (Embedding / Denormalization): Estruturas 1:1 e 1:Poucos são incorporadas diretamente dentro do documento pai como subdocumentos ou arrays. Permite recuperar todo o contexto com uma única leitura atômica de disco sem JOINs. Vantagem: velocidade extrema. Limite: tamanho máximo de documento de 16MB no MongoDB. 2. Referenciar (Referencing / Normalization): Estruturas 1:Muitos e N:N mantêm identificadores (ObjectId) apontando para documentos em coleções separadas, resolvidos via operador $lookup. 3. Aggregation Pipeline: Framework de processamento de dados em múltiplos estágios ($match, $project, $group, $sort, $unwind) executado com aceleração nativa pelo motor do banco.
📐 Arquitetura Conceitual & Diagrama de Fluxo
graph TD
DocOrder["Documento do Pedido (BSON)"] --> ID["_id: ObjectId('...')"]
DocOrder --> Customer["customer: { id: 10, nome: 'Ana', email: 'ana@email.com' } (Embutido!)"]
DocOrder --> Items["items: [ { prod_id: 1, qtd: 2 }, { prod_id: 5, qtd: 1 } ] (Array Embutido!)"]
DocOrder --> Total["total: 350.00"]
style DocOrder fill:#e8f5e9,stroke:#2e7d32
style Customer fill:#e1f5fe,stroke:#01579b
style Items fill:#fff3e0,stroke:#e65100 🔍 Pilares e Diretrizes Técnicas
Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Atomicidade em Nível de Documento: Operações de escrita e atualização em um único documento são garantidamente atômicas. - Índices Multikey: Indexação nativa de valores contidos dentro de arrays de subdocumentos. - Escalabilidade com Sharding: Distribuição automática de coleções entre múltiplos nós através de uma Chave de Shard (Shard Key). - Esquemas com Validação JSON Schema: Garantia de regras mínimas de tipagem através do validador nativo $jsonSchema.
🛠️ 2. Implementação Prática em Bancos NoSQL e MongoDB
Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:
// aggregation_pipeline.js (Pipeline de Agregação Analítica no MongoDB)
// Pipeline de Análise de Faturamento por Categoria
db.orders.aggregate([
// 1. Filtra apenas pedidos concluídos
{ $match: { status: "DELIVERED" } },
// 2. Desmembra o array de itens em múltiplos documentos
{ $unwind: "$items" },
// 3. Agrupa por categoria de produto e calcula totais
{
$group: {
_id: "$items.category",
totalRevenue: { $sum: { $multiply: ["$items.price", "$items.quantity"] } },
totalUnitsSold: { $sum: "$items.quantity" }
}
},
// 4. Ordena pelas categorias mais rentáveis
{ $sort: { totalRevenue: -1 } },
// 5. Formata a projeção final
{
$project: {
_id: 0,
category: "$_id",
totalRevenue: 1,
totalUnitsSold: 1
}
}
]);
💡 Análise Passo a Passo do Código
- Estágio $unwind: Converte cada item do array em um fluxo individual de dados para permitir agrupamentos estatísticos precisos.
- Cálculo com $multiply e $sum: Multiplica preço por quantidade e soma o faturamento total da categoria diretamente no motor C++ do MongoDB.
- Execução em Pipeline: Cada estágio processa e entrega dados filtrados para o próximo estágio sem consumo excessivo de memória.
🎯 3. Próximos Passos & Sequência Didática
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto