Aggregation pipeline é SQL do MongoDB. Filtra, agrupa, transforma documentos. Processa bilhões de docs com performance.
Conceitos Principais
Pipeline Stages
Array de stages. Cada stage transforma docs. $match → $group → $sort → $project. Output de um é input do próximo.
$match
Filtra documentos. Equivalente a WHERE. Coloque early no pipeline. Usa índices.
$group
Agrupa por field. Acumulators: $sum, $avg, $max, $min. Equivalente a GROUP BY.
$lookup
JOIN entre collections. Left outer join. Pode ser lento se não otimizado.
Passo a Passo
- Aggregation Básico: db.orders.aggregate([{ $match: { status: "completed" }}, { $group: { _id: "$product", total: { $sum: "$quantity" }}}, { $sort: { total: -1 }}, { $limit: 10 }]);
- $lookup JOIN: db.orders.aggregate([{ $lookup: { from: "products", localField: "productId", foreignField: "_id", as: "product" }}, { $unwind: "$product" }]);
- $project Shape: { $project: { _id: 0, userName: "$user.name", total: { $multiply: ["$price", "$quantity"] }}}. Seleciona e transforma fields.
- Performance: $match e $sort early. Use índices. $lookup pode ser lento (denormalize se possível). $limit após $sort.
- Node.js: const pipeline = [{ $match: {...}}, { $group: {...}}]; const results = await collection.aggregate(pipeline).toArray();
Boas Praticas
Recomendacoes
• $match early (usa índices)
• $project early (menos dados)
• Índices em $match e $sort fields
• Denormalize ao invés de $lookup quando possível
• allowDiskUse: true para datasets grandes
• Explain pipeline para otimizar
Erros Comuns
Evite estes erros
• $lookup sem índices (lento)
• $match depois de $group (processa tudo)
• Não usar $project (transfere dados desnecessários)
• Pipeline muito complexo (quebrar em etapas)
• Não testar performance
Checklist
- Pipeline básico funcionando
- $match com índices
- $lookup otimizado
- $project reduzindo dados
- Performance testada
- Explain executado