top of page

Como fazer agrupamento e agregação no MongoDB

  • Foto do escritor: Rodrigo Saito
    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:

Inserção de dados de pedidos de Pizza - parte 1
Inserção de dados de pedidos de Pizza - parte 1

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 é:

Resultado parcial da agregação, utilizando mais funções.
Resultado parcial da agregação, utilizando mais funções.

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

Utilizando o pipeline do MongoDB Compass
Utilizando o pipeline do MongoDB Compass

O pipeline é uma forma de você praticar, fazendo a cada parte da sua agregação.



Referências:



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.


 
 
 

コメント


Nunca perca um post. Assine agora!

Caso queira receber noticias sobre o blog, assine!

© 2022 por datalib

  • Ícone do Facebook Cinza
  • Ícone do Linkedin Cinza
bottom of page