Dia 07 de 15

Framework de Agregação — Parte 1

Olá, dev! Seja bem-vindo ao Dia 07 da sua jornada preparatória para a certificação MongoDB Associate Developer. Hoje iniciamos um dos tópicos de maior peso no exame: o Aggregation Framework (Framework de Agregação), responsável pelo processamento de dados e transformações complexas no banco.

1. O Conceito de Pipeline de Agregação

O Framework de Agregação é estruturado no conceito de Pipeline (esteira de processamento). Uma pipeline consiste em um array ordenado de estágios (stages), onde a saída de um estágio torna-se automaticamente a entrada para o próximo:

Coleção de Dados $\rightarrow$ [ Estágio 1 ] $\rightarrow$ [ Estágio 2 ] $\rightarrow$ [ Estágio N ] $\rightarrow$ Resultado Final

Sintaxe básica no mongosh:

db.colecao.aggregate([
  { $match: { ... } },
  { $group: { ... } },
  { $sort: { ... } }
])

2. Estágios Fundamentais da Pipeline

A. `$match` (Filtragem)

Filtra os documentos para passar apenas aqueles que atendem às condições especificadas para o próximo estágio. A sintaxe de filtros é idêntica à do método find().

B. `$project` vs. `$addFields`

// Referenciando campos existentes usa-se o cifrão com aspas: "$valorTotal"
db.pedidos.aggregate([
  {
    $addFields: {
      valorComDesconto: { $multiply: ["$valorTotal", 0.9] }
    }
  }
])

C. `$group` e Acumuladores

Agrupa documentos pelo valor de uma chave especificada no campo mandatório _id e calcula métricas agregadas.

db.pedidos.aggregate([
  {
    $group: {
      _id: "$categoria",                       // Chave do agrupamento
      totalVendas: { $sum: "$valorTotal" },    // Somatório
      quantidadePedidos: { $sum: 1 },          // Contagem de documentos
      ticketMedio: { $avg: "$valorTotal" },     // Média aritmética
      menorVenda: { $min: "$valorTotal" },      // Valor mínimo
      maiorVenda: { $max: "$valorTotal" }       // Valor máximo
    }
  }
])

Acumuladores Frequentes no Exame:

D. `$sort`, `$limit` e `$skip`

Ordenam, limitam e pulam documentos no fluxo da pipeline.

db.pedidos.aggregate([
  { $sort: { totalVendas: -1 } },
  { $skip: 10 },
  { $limit: 5 }
])

3. Limitações de Memória RAM na Pipeline

Por padrão, cada estágio de uma pipeline de agregação possui um limite máximo estrito de 100 Megabytes de memória RAM.

Se um estágio de agrupamento ou ordenação (como $group ou $sort sem índice) ultrapassar 100 MB de consumo de memória, a consulta falhará e retornará erro.

// Permitindo uso de disco para evitar estourar os 100 MB de RAM
db.vendasGiga.aggregate(
  [
    { $match: { ano: 2026 } },
    { $group: { _id: "$clienteId", total: { $sum: "$valor" } } }
  ],
  { allowDiskUse: true }
)

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

Questão 1: Por que é considerado uma boa prática de arquitetura e performance posicionar o estágio $match logo no início de uma pipeline de agregação?

A) Porque o estágio $match não pode ser executado após um $group.
B) Porque no início da pipeline o $match pode utilizar os índices da coleção e filtrar dados antecipadamente.
C) Porque o $match desabilita o limite de 100 MB de memória RAM.
D) Porque o $match converte automaticamente os documentos para BSON em memória.

Resposta Correta: B. Posicionar $match no início permite o aproveitamento de índices da coleção e minimiza a carga de trabalho dos estágios subsequentes.

Questão 2: Uma pipeline de agregação falhou com o erro: "Exceeded memory limit of 100MB" no estágio $sort. Qual é a forma correta de resolver este problema mantendo a consulta funcional?

A) Aumentar o limite de tamanho do documento BSON para 32 MB.
B) Adicionar a opção { allowDiskUse: true } na chamada do método aggregate().
C) Substituir o estágio $sort pelo operador $project.
D) Remover o estágio $match da consulta.

Resposta Correta: B. O parâmetro allowDiskUse: true habilita o MongoDB a usar o disco para armazenar dados temporários quando o estágio ultrapassa 100 MB de RAM.