Pular para conteúdo

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

  1. Estágio $unwind: Converte cada item do array em um fluxo individual de dados para permitir agrupamentos estatísticos precisos.
  2. Cálculo com $multiply e $sum: Multiplica preço por quantidade e soma o faturamento total da categoria diretamente no motor C++ do MongoDB.
  3. 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