1001Ferramentas
🌿Geradores

Gerador de MongoDB aggregate()

Constrói pipelines aggregate() do MongoDB com $match, $group, $sort, $limit em sequência. Pronto para colar.


  

Pipeline de Agregação do MongoDB

O pipeline de agregação é a primitiva de processamento de dados mais poderosa do MongoDB. Um pipeline é um array de estágios executados em ordem — cada estágio transforma o stream de documentos e alimenta o próximo: db.collection.aggregate([{ $match: ... }, { $group: ... }, { $sort: ... }]). Ele substitui o antigo mapReduce, roda paralelizado nativamente no engine de storage e é a base de qualquer dashboard, relatório de BI e query analítica em projetos modernos.

Estágios principais

  • $match — filtro como o find; coloque-o primeiro para usar índice.
  • $project, $addFields/$set, $replaceRoot — remodelam documentos.
  • $group — agrupa por expressão e aplica acumuladores.
  • $sort, $limit, $skip, $count, $sample.
  • $unwind — desnormaliza arrays, um documento por elemento.
  • $lookup — JOIN à esquerda contra outra coleção.
  • $facet — roda vários sub-pipelines em paralelo retornando um único documento.
  • $bucket, $bucketAuto — histogramas.
  • $out, $merge — gravam o resultado em coleção (views materializadas).
  • $densify, $fill — preenchimento de séries temporais (MongoDB 5.1+).

Acumuladores de grupo e expressões

Dentro do $group: $sum, $avg, $min, $max, $count, $push (array), $addToSet (conjunto), $first, $last, $stdDevPop/$stdDevSamp, $median/$percentile (5.0+). Expressões condicionais aparecem em todo lugar: $cond (if/else), $switch, $ifNull; aritmética com $multiply, $divide, $mod; strings com $concat, $toUpper, $regexMatch; datas com $dateToString, $dateDiff.

Exemplo prático — top 10 clientes

db.orders.aggregate([
  { $match: { status: "completed", createdAt: { $gte: ISODate("2025-01-01") } } },
  { $group: { _id: "$userId", total: { $sum: "$amount" }, orders: { $sum: 1 } } },
  { $sort: { total: -1 } },
  { $limit: 10 },
  { $lookup: { from: "users", localField: "_id", foreignField: "_id", as: "user" } },
  { $unwind: "$user" },
  { $project: { _id: 0, nome: "$user.name", total: 1, orders: 1 } }
])

Performance

Regras práticas: empurre $match e $project o mais cedo possível; só o primeiro estágio usa índice, então um $match + $sort na frente é o que mais importa. O otimizador reordena estágios quando é seguro. Limite duro: 100 MB de RAM por estágio; passe { allowDiskUse: true } para agrupamentos/sorts grandes. Cada documento ainda tem teto de 16 MB. Inspecione o plano com db.collection.aggregate(pipeline).explain('executionStats'). O Atlas Search adiciona o estágio $search com Lucene para busca textual/vetorial.

Perguntas frequentes

Agregação substitui o MapReduce? Sim. O mapReduce está depreciado desde o MongoDB 5.0 — a agregação é mais rápida, roda em paralelo e cobre quase todos os padrões de JS com operadores nativos.

Meu $match usa índice? Só se for o primeiro estágio e o campo estiver indexado. Um $match após $project ou $group roda sobre documentos intermediários, sem índice.

O pipeline está complicado demais para escrever na mão? Use o MongoDB Compass — a aba Aggregation tem builder visual com preview ao vivo; o Studio 3T oferece uma UI drag-and-drop ainda mais rica e exporta para JS/Python/Java.

Dá para materializar uma view? Sim — termine o pipeline com $out: "summary" (substitui a coleção) ou $merge (upsert), e agende como Atlas Trigger ou cron externo. db.createView() também reaproveita pipelines para views só-leitura.

Ferramentas Relacionadas