Dia 10 de 15

Padrões Avançados de Modelagem & Validação de Esquema

Olá, dev! Seja bem-vindo ao Dia 10 da sua preparação para a certificação MongoDB Associate Developer. Hoje consolidaremos o módulo de arquitetura estudando os principais Schema Design Patterns (Padrões de Projeto de Esquema) e como impor integridade de dados usando JSON Schema.

1. Padrões Avançados de Design de Esquema

A. Bucket Pattern (Padrão Balde / Agrupamento)

Utilizado principalmente para séries temporais (time-series) e dados de IoT. Em vez de armazenar cada leitura de sensor como um documento individual (gerando milhões de documentos e sobrecarregando índices), agrupam-se as leituras por intervalo de tempo (ex: 1 hora) em um documento "balde".

// Documento aplicando o Bucket Pattern
{
  sensorId: 1042,
  dataInicio: ISODate("2026-08-12T08:00:00Z"),
  count: 60,
  temperaturaMedia: 24.5,
  leituras: [
    { t: ISODate("2026-08-12T08:01:00Z"), v: 24.1 },
    { t: ISODate("2026-08-12T08:02:00Z"), v: 24.3 }
  ]
}

B. Subset Pattern (Padrão Subconjunto)

Resolve o problema de arrays gigantes que raramente são lidos por inteiro (ex: um produto com 1.000 avaliações ou um filme com 200 atores no elenco). Armazenam-se apenas os N elementos mais acessados (ex: as 10 avaliações mais recentes) no documento principal, mantendo o histórico completo em uma coleção referenciada.

C. Extended Reference Pattern (Referência Estendida)

Evita a necessidade de realizar junções ($lookup) frequentes apenas para buscar informações estáticas de uma entidade pai. Copiam-se apenas os campos estáticos essenciais frequentemente lidos junto com a chave primária.

// No documento 'pedido', armazenam-se 'clienteId' e 'nomeCliente'
{
  _id: ObjectId("..."),
  data: ISODate("2026-08-12"),
  cliente: {
    id: ObjectId("60a..."),
    nome: "Ada Lovelace" // Campo estático copiado para evitar $lookup na listagem
  }
}

D. Polymorphic Pattern (Padrão Polimórfico)

Utilizado quando documentos de uma mesma coleção possuem estruturas diferentes, mas compartilham um propósito semelhante (ex: catálogo de produtos de e-commerce). Diferenciam-se pelo uso de um campo discriminador (ex: tipo: "LIVRO", tipo: "ELETRONICO").

E. Computed Pattern (Padrão Computado)

Aplica-se a cálculos intensivos que seriam caros para executar em runtime durante leituras. O resultado é calculado no momento da escrita/atualização utilizando operadores atômicos como $inc e persistido diretamente no documento.

2. Validação de Esquema com JSON Schema (`$jsonSchema`)

Apesar de o MongoDB possuir esquema flexível, é possível impor regras de validação rígidas em nível de coleção utilizando o padrão JSON Schema.

db.createCollection("usuarios", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["nome", "email", "idade", "status"],
      properties: {
        nome: {
          bsonType: "string",
          description: "Nome é obrigatório e deve ser uma string."
        },
        email: {
          bsonType: "string",
          pattern: "^.+@.+$",
          description: "E-mail deve ser válido."
        },
        idade: {
          bsonType: "int",
          minimum: 18,
          description: "Idade deve ser um inteiro de no mínimo 18 anos."
        },
        status: {
          enum: ["ATIVO", "INATIVO", "PENDENTE"],
          description: "Status aceita apenas valores do enum."
        }
      }
    }
  },
  validationLevel: "strict", // Options: 'strict' ou 'moderate'
  validationAction: "error"  // Options: 'error' (rejeita) ou 'warn' (registra no log)
})
Pegadinha Clássica de Certificação:

3. Questões no Estilo Exame de Certificação

Questão 1: Uma aplicação de filmes exibe na página inicial de cada filme o título, a foto de capa e os nomes dos 5 atores principais. A lista completa com mais de 100 atores secundários e equipe técnica só é exibida ao clicar em "Ver elenco completo". Qual padrão de design otimiza essa página inicial?

A) Bucket Pattern.
B) Subset Pattern.
C) Polymorphic Pattern.
D) Outlier Pattern.

Resposta Correta: B. O Subset Pattern guarda os dados mais acessados (os 5 principais atores) no documento principal e o restante em uma coleção separada.

Questão 2: Qual combinação de parâmetros de validação de esquema garante que documentos inválidos sejam rejeitados com erro durante o `insertOne`, enquanto impede que gravações em documentos antigos incompatíveis sejam bloqueadas durante um `updateOne`?

A) validationLevel: "strict" e validationAction: "warn"
B) validationLevel: "moderate" e validationAction: "error"
C) validationLevel: "off" e validationAction: "error"
D) validationLevel: "strict" e validationAction: "error"

Resposta Correta: B. O nível moderate aplica o schema a novos documentos e a atualizações de documentos já válidos, ignorando atualizações em documentos legados inválidos. O validationAction: "error" garante que as gravações inválidas sejam rejeitadas com erro.