Aggregation, Produtos mais abandonados em carrinho em determinado período


Olá, é a primeira vez que ouve falar em Aggregations por aqui? Sugerimos que dê uma olhada também nos nossos outros tópicos sobre o assunto.

No nosso segundo tópico, aprendemos como construir uma aggregation para listar os produtos mais pedidos em um determinado período, a ideia da aggregation desse tópico é listar os produtos mais abandonados no carrinho de compra em um determinado período.

Então pegue seu café :coffee: e vamos nessa :rocket: ……

REALIZAR A AGGREGATION


Se essa não é sua primeira vez por aqui, você já sabe que vamos precisar de alguns dados importantes para realização da aggregation, mas se essa é sua primeira vez, saiba que iremos precisar das seguintes informações:

ID da loja, ID da sua autenticação e o token, caso tenha dificuldades de onde encontrar tais dados, sugerimos que veja o primeiro tópico sobre o assunto, pois este tópico contém um passo-a-passo mais detalhado de como obter essas informações.

Como já sabemos que as aggregations são requisições realizadas no endpoint https://api.e-com.plus/v1/$aggregate.json da nossa API :purple_heart: utilizando o método POST, contendo em seu Header os seguintes dados:

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

Obs: Para a realização da requisição na nossa API :purple_heart:, iremos utilizar aqui o Hoppscotch (https://hoppscotch.io/ ).

Além do endpoint, método e header, nossa requisição irá utilizar um body, como já mencionado em outros tópicos é o segredo das nossas aggregations, sendo esse body, composto por um resource e um pipeline. O resource que irá identificar qual collection iremos analisar, que nesse caso será carts. Já o pipeline irá filtrar através de estágios a nossa aggregation, para obtermos o nosso resultado esperado.


PIPELINE DA AGGREGATION


Nessa aggregation, iremos utilizar quatro estágios:

  • 1º estágio: Iremos definir o período que queremos analisar e se o carrinho foi mesmo abandonado. Nesse exemplo estamos avaliando o período do dia 01-01-2022 à 24-08-2022, a propriedade que verificamos se o carrinho foi mesmo abandonado ou não é a completed, aqui verificamos se seu valor é falso.
"$match" : {
    "created_at": {"$gte" : "2022-01-01T00:00:00.000Z", "$lte" : "2022-08-24T23:59:59.999Z"},
    "completed": {"$eq": false}
}
  • 2º estágio: Separamos nossos itens do carrinho, para que possamos contabilizar itens diferentes de um mesmo pedido.
"$unwind": "$items"
  • 3º estágio: Aqui vamos agrupar os itens e contabilizá-los, sendo agrupados pelo _id, que é definido pelo id do produto, nome do produto e id da variação do produto (se houver) e a contabilização é feita um somatório de quantos carrinhos esse produto foi abandonado.
"$group": {
    "_id": {
        "product_id": "$items.product_id",
        "name": "$items.name",
        "variation_id": "$items.variation_id"
    },
    "count": {
        "$sum": 1
     }
}
  • 4º estágio: Último e não menos importante o nosso estágio de ordenação, que irá ordenar nosso resultado em ordem decrescente, dos produtos que mais foram abandonados em carrinhos.
"$sort": {
    "count": -1
}

BODY DA AGGREGATION


O body da nossa aggregation terá o seguinte formato:

{
    "resource" : "carts",
     "pipeline" : [
        {
           "$match" : {
               "created_at": {"$gte" : "2022-01-01T00:00:00.000Z", "$lte" : "2022-08-24T23:59:59.999Z"},
               "completed": {"$eq": false}
           }
        },
        {
         "$unwind": "$items"
        },
        {
           "$group": {
               "_id": {
                   "product_id": "$items.product_id",
                   "name": "$items.name",
                   "variation_id": "$items.variation_id"
               },
               "count": {
                   "$sum": 1
               }
           }
        },
        {
           "$sort": {
               "count": -1
           }
        }
     ]
}

RESULTADO DA AGGREGATION


A requisição da aggregation construída acima, produzirá um resultado semelhante ao seguir:

{
   "result": [
       {
           "_id": {
               "product_id": "p00000000000000000000001",
               "name": "Vaso para orquídeas / M",
               "variation_id": "vp0000000000000000000001"
           },
           "count": 21
       },
       {
           "_id": {
               "product_id": "p00000000000000000000010",
               "name": "Boleira Vermelha"
           },
           "count": 15
       },
       {
           "_id": {
               "product_id": "p00000000000000000000007",
               "name": "Bandeja Frizada Preta G"
           },
           "count": 4
       },
       {
           "_id": {
               "product_id": "p00000000000000000000005",
               "name": "Cocô de Cerâmica"
           },
           "count": 3
       },
       {
           "_id": {
               "product_id": "p00000000000000000000002",
               "name": "Tesoura para Poda / Verde limão / M",
               "variation_id": "vp00000000000000000000015"
           },
           "count": 3
       },
       {
           "_id": {
               "product_id": "p00000000000000000000002",
               "name": "Tesoura para Poda / Prata / M",
               "variation_id": "vp0000000000000000000016"
           },
           "count": 1
       },
       {
           "_id": {
               "product_id": "p00000000000000000000002",
               "name": "Tesoura para Poda / Verde limão / G",
               "variation_id": "vp0000000000000000000009"
           },
           "count": 1
       }
   ]
}

Percebemos que o result é uma lista no qual contém um _id contendo o product_id, name, variation_id (caso exista), sendo respectivamente, o id do produto , nome do produto e id da variação caso o produto contenha uma variação; além do _id, a lista possui um count que corresponde a quantidade de vezes que esse produto for abandonado em um carrinho.

Show, essa foi mais uma aggregation, esperamos que esse exemplo possa contribuir ainda mais para vocês. :purple_heart:

E até breve. :raising_hand_man:t5:

4 curtidas