Aggregation, para lista de produtos mais pedidos em um determinado período

Aqui vamos mostrar um pouco mais de como podemos utilizar as aggregations, como dito no outro artigo sobre o assunto, as aggregations são operações onde podemos agrupar dados e gerar resultados conforme as nossas necessidades, para realizarmos algumas análise de dados da nossa loja na E-com Plus :purple_heart:.

Na nossa aggregation de hoje, vamos listar os produtos mais pedidos em um determinado período de tempo, preparados? Café está na mão :coffee:? Sim… vamos lá… :rocket: :rocket:


COMO REALIZAR A AGGREGATION


Vamos precisar de alguns dados importantes para realizarmos a nossa requisição, tais como ID da loja, ID da sua autenticação e o token. Não sabe onde encontrar esses dados? Recomendo aqui que leia nossa postagem anterior sobre aggregations : Como criar agrupamentos de dados, Aggregation, nela realizamos um passo-a-passo de como coletar as informações necessárias e como realizar uma aggregation.

De posse das informações necessárias descritas anteriormente, então vamos a nossa requisição de aggregation. Nesta requisição também iremos utilizar o Hoppscotch (https://hoppscotch.io/ ) para realizar a aggregation em nossa API :heart_eyes:.

As aggregations são uma requisições de método POST, na seguinte url: https://api.e-com.plus/v1/$aggregate.json

O Header da requisição deverá conter as seguintes informações:

  • X-Store-ID: Id_da_sua_loja
  • X-Access-Token: seu_token_atualizado
  • X-My-ID: id_da_sua_autenticacao


Por isso a importância de ter essas informações antes de realizarmos a requisição de aggregation.

Como dito na nossa outra postagem sobre aggregations, o segredos delas está no body da requisição, onde iremos passar duas propriedades: a primeira é o resource, no qual vamos informar qual collection (tabela) iremos realizar a operação e a segunda propriedade é o pipeline que é um conjunto de estágios em nossa operação.

Sobre o resource, como iremos listar os produtos mais pedidos em um determinado período de tempo, nossa operação será realizada na colletion de pedidos ou seja na orders.

O pipeline terá os seguintes estágios:

  • Primeiro estágio é:
{
 "$match": {
   "created_at": {
    "$gte": "2022-01-01T00:00:00.000Z"
   }
  }
},

que irá definir a data inicial da nossa requisição, neste exemplo estamos utilizando a data do dia 01 de Maio de 2022 para ser a data de início da nossa operação.

  • O segundo estágio é:
{
 "$match": {
   "created_at": {
    "$lte": "22022-12-31T23:59:59.999Z"
   }
  }
},

que irá definir a data final do nosso período de busca, aqui a data escolhida foi 31 de Maio de 2022.

Obs: Nestes dois primeiros estágios é que definimos o período que gostaríamos de analisar, neste exemplo usamos o período do mês de Maio, mas poderia ser qualquer período que desejássemos analisar.

  • O terceiro estágio é:
{
 "$unwind": "$items"
},

aqui nesse estágio iremos separar nosso itens do pedido, para que possamos contabilizar itens diferentes de um mesmo pedido.

  • Já o nosso quarto estágio é
{
  "$group": {
    "_id": "$items.product_id",
    "count": {
      "$sum": "$items.quantity"
     }
  }
},

um agrupamento dos itens, que serão agrupados pelo _id do produto (product_id) e será contabilizado a quantidade desse produto na propriedade count

  • Já o nosso quinto e último estágio, porém não menos importante, é a ordenação da nossa resposta que deverá ser em ordem decrescente, ou seja, os produtos com mais quantidade de pedidos estarão no topo da nossa lista de resposta.
{
  "$sort": {
    "count": -1
    }
}

Sendo assim o body da nossa requisição terá a seguinte forma:

{
  "resource": "orders",
  "pipeline": [
    {
      "$match": {
        "created_at": {
          "$gte": "2022-01-01T00:00:00.000Z"
        }
      }
    },
    {
      "$match": {
        "created_at": {
          "$lte": "2022-12-31T23:59:59.999Z"
        }
      }
    },
    {
      "$unwind": "$items"
    },
    {
      "$group": {
        "_id": "$items.product_id",
        "count": {
          "$sum": "$items.quantity"
        }
      }
    },
    {
      "$sort": {
        "count": -1
      }
    }
  ]
}


A nossa resposta terá o seguinte formato:

{
  "result": [
    {
      "_id": "6166cb1528ace502aea2dc36",
      "count": 5
    },
    {
      "_id": "5f8dd8e8b2161709fa40c620",
      "count": 1
    }
  ]
}

Ou seja, houveram 5 pedidos do produto com o _id 6166cb1528ace502aea2dc36 e 1 pedido do produto cujo o _id é 5f8dd8e8b2161709fa40c620, no período do dia 1 de maio de 2022 à 31 de maio de 2022.

Espero que este artigo possa contribuir para vocês nas análises de seus pedidos e também em como vocês podem construir suas próprias aggregations.

Até breve pessoal :raising_hand_man:t5: :purple_heart:.

4 curtidas

Boa @wisley, bom pra virar um relatório isso ai. No caso, desse agrupamento, além da soma de quantos itens foram vendidos em um determinado período, conseguimos ter o retorno do nome do produto por exemplo?

1 curtida

@Matheus , sim há algumas alternativas uma delas poderiamos, trocar o _id do estágio do $group para $items.name:

{
  "$group": {
    "_id": "$items.name",
    "count": {
      "$sum": "$items.quantity"
    }
}

outra alternativa seria adicionar o name em uma outra propriedade.

{
  "$group": {
    "_id": "$items.product_id",
    "count": {
      "$sum": "$items.quantity"
    },
    "name": {
      "$addToSet": "$items.name" 
    }
  }
}
1 curtida