Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

Aggregation Pipeline

Nesta página

  • Exemplos de Pipeline de Agregação Completo
  • Detalhes Adicionais do Estágio de Pipeline de Agregação
  • Expressões de Pipeline de Agregação
  • Execute um Pipeline de Agregação
  • Atualizar documentos usando um aggregation pipeline
  • Outras Considerações
  • Saiba mais

Um aggregation pipeline possui um ou mais estágios que processam documentos:

  • Cada estágio executa uma operação nos documentos de entrada. Por exemplo, um estágio pode filtrar documentos, agrupar documentos e calcular valores.

  • Os documentos vão de um estágio para outro.

  • Um aggregation pipeline pode retornar resultados para grupos de documentos. Por exemplo, retornar o valor total, médio, máximo e mínimo.

A partir do MongoDB 4,2, você pode atualizar documentos com uma aggregation pipeline se usar os estágios mostrados em Atualizações com Aggregation Pipeline.

Observação

Você pode executar aggregation pipelines na UI para sistemas hospedados no MongoDB Atlas.

Ao executar aggregation pipeline em implantações do MongoDB Atlas na UI do MongoDB Atlas, você pode visualizar os resultados em cada estágio.

Esta seção mostra exemplos de pipeline de agregação que usam a seguinte coleção de pizza orders:

db.orders.insertMany( [
{ _id: 0, name: "Pepperoni", size: "small", price: 19,
quantity: 10, date: ISODate( "2021-03-13T08:14:30Z" ) },
{ _id: 1, name: "Pepperoni", size: "medium", price: 20,
quantity: 20, date : ISODate( "2021-03-13T09:13:24Z" ) },
{ _id: 2, name: "Pepperoni", size: "large", price: 21,
quantity: 30, date : ISODate( "2021-03-17T09:22:12Z" ) },
{ _id: 3, name: "Cheese", size: "small", price: 12,
quantity: 15, date : ISODate( "2021-03-13T11:21:39.736Z" ) },
{ _id: 4, name: "Cheese", size: "medium", price: 13,
quantity:50, date : ISODate( "2022-01-12T21:23:13.331Z" ) },
{ _id: 5, name: "Cheese", size: "large", price: 14,
quantity: 10, date : ISODate( "2022-01-12T05:08:13Z" ) },
{ _id: 6, name: "Vegan", size: "small", price: 17,
quantity: 10, date : ISODate( "2021-01-13T05:08:13Z" ) },
{ _id: 7, name: "Vegan", size: "medium", price: 18,
quantity: 10, date : ISODate( "2021-01-13T05:10:13Z" ) }
] )

O exemplo de aggregation pipeline abaixo contém dois estágios e retorna a quantidade total do pedido de pizzas médias agrupadas pelo nome da pizza:

db.orders.aggregate( [
// Stage 1: Filter pizza order documents by pizza size
{
$match: { size: "medium" }
},
// Stage 2: Group remaining documents by pizza name and calculate total quantity
{
$group: { _id: "$name", totalQuantity: { $sum: "$quantity" } }
}
] )

O estágio $match:

  • Filtra os documentos de pedido de pizza em pizzas com um size de medium.

  • Repassa os documentos restantes para o estágio $group.

O estágio $group:

  • Agrupa os documentos restantes por name da pizza.

  • Utiliza $sum para calcular a quantity total do pedido para cada pizza de name. O total é armazenado no campo totalQuantity retornado pelo aggregation pipeline.

Saída de exemplo:

[
{ _id: 'Cheese', totalQuantity: 50 },
{ _id: 'Vegan', totalQuantity: 10 },
{ _id: 'Pepperoni', totalQuantity: 20 }
]

O exemplo a seguir calcula o valor total do pedido de pizza e a quantidade média do pedido entre duas datas:

db.orders.aggregate( [
// Stage 1: Filter pizza order documents by date range
{
$match:
{
"date": { $gte: new ISODate( "2020-01-30" ), $lt: new ISODate( "2022-01-30" ) }
}
},
// Stage 2: Group remaining documents by date and calculate results
{
$group:
{
_id: { $dateToString: { format: "%Y-%m-%d", date: "$date" } },
totalOrderValue: { $sum: { $multiply: [ "$price", "$quantity" ] } },
averageOrderQuantity: { $avg: "$quantity" }
}
},
// Stage 3: Sort documents by totalOrderValue in descending order
{
$sort: { totalOrderValue: -1 }
}
] )

O estágio $match:

  • Filtra os documentos do pedido de pizza para aqueles em um intervalo de datas especificado usando $gte e $lt.

  • Repassa os documentos restantes para o estágio $group.

O estágio $group:

  • Agrupa os documentos por data usando $dateToString.

  • Para cada grupo, calcula:

  • Passa os documentos agrupados para o estágio $sort.

O estágio $sort:

  • Classifica os documentos pelo valor total do pedido para cada grupo em ordem decrescente (-1).

  • Retorna os documentos classificados.

Saída de exemplo:

[
{ _id: '2022-01-12', totalOrderValue: 790, averageOrderQuantity: 30 },
{ _id: '2021-03-13', totalOrderValue: 770, averageOrderQuantity: 15 },
{ _id: '2021-03-17', totalOrderValue: 630, averageOrderQuantity: 30 },
{ _id: '2021-01-13', totalOrderValue: 350, averageOrderQuantity: 10 }
]

Dica

Veja também:

Um aggregation pipeline possui um ou mais estágios que processam documentos:

  • Um estágio não precisa produzir um documento para cada documento de entrada. Por exemplo, algumas etapas podem produzir novos documentos ou filtrar documentos.

  • O mesmo estágio pode aparecer várias vezes no pipeline com as seguintes exceções de estágio: $out, $merge e $geoNear.

  • Para calcular médias e executar outros cálculos em um estágio, utilize expressões de aggregation que especificam operadores de aggregation. Você aprenderá mais sobre expressões de aggregation na próxima seção.

Para todos os estágios de aggregation, consulte Estágios de aggregation.

Alguns estágios do aggregation pipeline aceitam uma expressão de aggregation, que:

Você pode usar os operadores de agregação $accumulator e $function para definir expressões de agregação personalizadas no JavaScript.

Para todas as expressões de agregação, consulte Operadores de Expressão.

Expressões de aggregation utilizam o caminho do campo para acessar campos nos documentos de entrada. Para especificar um caminho do campo, prefixe o nome do campo ou o nome do campo com pontos (se o campo estiver no documento incorporado) com um cifrão $. Por exemplo, "$user" para especificar o caminho do campo para o campo user ou "$user.name" para especificar o caminho do campo para o campo "user.name".

"$<field>" é equivalente a "$$CURRENT.<field>", em que CURRENT é uma variável de sistema cujo padrão é a raiz do objeto atual, a menos que seja indicado o contrário em estágios específicos.

Para executar um aggregation pipeline, use:

Para atualizar documentos com um pipeline de agregação, use:

Comando
mongosh Métodos
findAndModify

Um aggregation pipeline tem limitações nos tipos de valor e no tamanho do resultado. Consulte Limites de aggregation pipeline.

Um aggregation pipeline oferece suporte a operações em collections fragmentadas. Consulte Pipeline de aggregation e collections fragmentadas.

A partir do MongoDB 5.0, map-reduce está obsoleto:

  • Em vez de map-reduce, você deve usar um aggregation pipeline. Os pipelines de agregação fornecem melhor desempenho e usabilidade do que o map-reduce.

  • Você pode reescrever operações de map-reduce utilizando aggregation pipeline stages, como $group, $merge e outros.

  • Para operações de map-reduce que exigem funcionalidade personalizada, você pode utilizar os operadores de agregação $accumulator e $function. Você pode usar esses operadores para definir expressão de agregação personalizadas no JavaScript.

Para obter exemplos de alternativas de aggregation pipeline para map-reduce, consulte:

Para saber mais sobre pipelines de agregação, consulte:

← Operações de agregação