🍃 AGGREGATION FRAMEWORK E PIPELINE
Se o find() te leva de 0 a 100 na abstração rápida, o Aggregation Framework te eleva de 100 a 1000, dominando qualquer Business Intelligence complexo. 🛡️🧩
Objetivo: Extrair poder máximo de relatórios cruzados (Análises, Filtros de Etapas, Projetos de Sub-campos Arrays, Group By nativo MQL).
📗 PASSO 1: A Arquitetura do Operador de Tubulação (Pipeline)
No relacional (SQL), a leitura da CPU e Ram do servidor obedece à linearidade estrita SELECT, FROM, WHERE, GROUP BY, HAVING.
Na matemática NoSQL distribuída, os dados massivos desistem das tabelas únicas, processando blocos e empurrando o resultado via "Pipeline" (Em lotes de estágios) para que uma máquina minúscula aguente trabalhar grandes Gigabytes.
📊 Ciclo de Estágios do Pipeline do BSON
flowchart LR
M1[🎯 1. $match] --> G1[📦 2. $group]
G1 --> P1[✂️ 3. $project]
P1 --> S1[🔢 4. $sort]
$match: Filtra como o clássicoWHEREe joga metade dos documentos no Lixo cedo (economiza Ram).$group: O clássicoGROUP BYe agregadores de soma (SUM, AVG).$project: Modela quais atributos a aplicação cliente receberá (Economiza Banda/Tráfego de Internet).$sort: Põe os dados em Ordem (ORDER BY).
📗 PASSO 2: Anatomia de Extração no MongoDB 7.0
Como o engenheiro descobre "Quantidade de Dinheiro da Filial SP nos últimos 7 dias?".
db.faturas.aggregate([
// 1º ETAPA DO CANO: CORTA O QUE NÃO FOR DE SÃO PAULO
{
$match: { filial: "SP", ano: 2026 }
},
// 2º ETAPA: JUNTA TODOS QUE SOBRARAM SOMANDO A FATURA E AGRUPANDO PELO VENDEDOR
{
$group: {
_id: "$vendedor",
faturamento_total: { $sum: "$valor_liquido" },
total_vendas: { $sum: 1 }
}
},
// 3º ETAPA: ORDENANDO O MELHOR FATURAMENTO
{
$sort: { faturamento_total: -1 } // -1 = DESCENDING
}
]);
📗 PASSO 3: Cross-Joins $lookup do MQL (DBRefs Profundos)
A ideia de que "MongoDB e NoSQL não faz Join" é Fake News Arquitetônica. Através do estágio $lookup da Pipeline moderna (> MongoDB 6.0+), unimos Arrays nativamente:
/* BUSCANDO PEDIDO E SUAS REFERÊNCIAS DE FATURA EXCLUSIVA */
db.pedidos.aggregate([
{
$lookup: {
from: "detalhesFatura", // Qual a "tabela" secundária
localField: "faturaId", // Onde está o ID nesse Documento A
foreignField: "_id", // Onde está o ID no Documento B (Fatura)
as: "faturaCorrigida" // Qual será o nome do Objeto Inserido Array
}
}
]);
💡 Nota do DBA Master: Assim que uma Collection cresce com velocidade, usar
$lookupesgota a CPU (ele compara 1 doc contra milhares toda hora). Se precisar buscar juntas sempre, mude a estrutura do projeto da Empresa e faça EMBEDDING JSON direto! 🚀🛡️