Como fazer agrupamento e agregação no MongoDB
- Rodrigo Saito
- 20 de mar.
- 3 min de leitura
Fala pessoal, tudo bem?
Agrupamentos e agregação são bem comuns no mundo SQL. São utilizados principalmente quando você precisa tirar relatórios gerenciais, onde os agrupamentos e resultados desses agrupamentos são utilizados e calculados (contagem, distinção, média, máximo, mínimo, etc).
No MongoDB também é possível fazer essas operações, com certa limitação, quando comparamos aos bancos de dados relacionais.
Para que possamos entender previamente o conceitos, vamos ao exemplo abaixo.
Utilize uma base de dados existente ou crie uma nova:
use exemploAgregacao;
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" ) }
] );
Adicione outros registros, com valores um pouco diferentes:
db.orders.insertMany( [
{ _id: 8, name: "Pepperoni", size: "small", price: 19,
quantity: 1, date: ISODate( "2021-03-20T08:14:30Z" ) },
{ _id: 9, name: "Pepperoni", size: "medium", price: 20,
quantity: 2, date : ISODate( "2021-03-21T09:13:24Z" ) },
{ _id: 10, name: "Pepperoni", size: "large", price: 21,
quantity: 3, date : ISODate( "2021-03-22T09:22:12Z" ) },
{ _id: 11, name: "Cheese", size: "small", price: 12,
quantity: 1, date : ISODate( "2021-03-14T11:21:39.736Z" ) },
{ _id: 12, name: "Cheese", size: "medium", price: 13,
quantity:2, date : ISODate( "2022-01-14T21:23:13.331Z" ) },
{ _id: 13, name: "Cheese", size: "large", price: 14,
quantity: 3, date : ISODate( "2022-01-14T05:08:13Z" ) },
{ _id: 14, name: "Vegan", size: "small", price: 17,
quantity: 4, date : ISODate( "2021-01-14T05:08:13Z" ) },
{ _id: 15, name: "Vegan", size: "medium", price: 18,
quantity: 5, date : ISODate( "2021-01-14T05:10:13Z" ) }
] );
O resultado será parecido como:

Apesar de ser uma tabela simples, será possível entender a sua utilização:
O exemplo de aggregation pipeline abaixo, mostra 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 resultado será parecido com o abaixo:

Primeiro é feito um filtro pelo tamanho (size) da pizza (collection order - pedido). e depois é aplicado o agrupamento, sendo o _id o nome da pizza (para o resultado da agregação), e calculando a quantidade pelo agrupamento nome, respeitando o filtro tamanho (size)
Outro exemplo, o abaixo faz o calculo do valor total de pedido (soma da quantidade vezes preço) por dia, retornando o resultado com o total e média da quantidade.
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 resultado parcial é:

Também é possível fazer a mesma consulta utilizando o ambiente gráfico do MongoDB Compass

O pipeline é uma forma de você praticar, fazendo a cada parte da sua agregação.
Referências:
MONGODBDOCS, Estágios da Agregação, disponível em <https://www.mongodb.com/pt-br/docs/manual/reference/operator/aggregation-pipeline/#std-label-aggregation-pipeline-operator-reference>, acessado em 19 de mar. de 2025.
MONGODBDOCS, Operações de Agregação, disponível em <https://www.mongodb.com/pt-br/docs/manual/aggregation/>, acessado em 19 de mar. de 2025.
MONGODBDOCS, Pipeline de agregação, disponível em <https://www.mongodb.com/pt-br/docs/manual/core/aggregation-pipeline/#std-label-aggregation-pipeline-examples>, acessado em 19 de mar. de 2025.
コメント