Aggregation, para lista de aniversariante de cada mês

Olá, nesse tópico vamos continuar a utilizar as aggregations, se você é novo por aqui sugiro que veja também os nossos outros tópicos sobre o assunto:

Hoje, no nosso tópico, além de quantificar iremos identificar esses aniversariantes. A ideia da nossa aggregation aqui é listar por cada mês, quantos aniversariantes possui, e uma lista com o id, nome, email e dia do aniversário.
Como de costume, já pegou o seu café :coffee:? Então vamos lá……. :rocket: :rocket:

REALIZAR A AGGREGATION


Aqui vamos precisar de alguns dados importantes, tais como ID da loja, ID da sua autenticação e o token, como já vimos nos outros tópicos, se você tiver dúvidas de como obter esses dados sugiro que veja nosso primeiro tópico, lá tem um passo a passo mais detalhado de como capturar essas informações. :star_struck:

As aggregations são requisições na URL (ou endpoint) https://api.e-com.plus/v1/$aggregate.json da nossa API :purple_heart: usando o método POST. Além disso precisamos utilizar as seguintes informações no Header (ou cabeçalho) da requisição:

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

As aggregations na nossa API :purple_heart:, precisam de duas propriedade importantíssimas que devem ser utilizadas no Body (ou corpo) da requisição; a primeira propriedade é a resource, onde identificamos qual collection (ou tabela) iremos realizar a operação e a segunda é a pipeline que é uma lista de estágios para filtragem e construção da aggregation.

Para realizar a requisição na nossa API :purple_heart: para a construção da aggregation estamos utilizando o Hoppscotch (https://hoppscotch.io/ ).

BODY DA AGGREGATION


Bom, como nosso exemplo aqui, tem o intuito de listar os aniversariantes de cada mês, então podemos definir que a collection que iremos utilizar é a customers, ou seja:

“resource”: “customers”

Já o nosso pipeline será dividido em três estágios:

  • 1º estágio: Verificamos se o customer cadastrou a data de nascimento, para isso iremos utilizar o seguinte passo:

    { "$match": { "birth_date.month": { "$exists": true } } },

  • 2º estágio: É onde realizamos o agrupamento, utilizando como _id do agrupamento o mês de aniversário dos customers, o total de aniversariantes e a lista de aniversariantes com id, nome, dia e email, para isso iremos utilizar o seguinte passo:

{
       "$group": {
           "_id": "$birth_date.month",
           "total": { "$sum": 1 },
           "birthdays": {
               "$addToSet": {
                   "id": "$_id",
                   "name": { "$concat": ["$name.given_name", " ", "$name.family_name"]} ,
                   "day": "$birth_date.day",
                   "email": "$main_email"
               }
           }
          
       }
   },

  • 3º estágio: Aqui vamos apenas realizar a ordenação do resultado, podendo ser ordenado pelo mês de aniversário ou pela quantidade de aniversariantes, podendo ser crescente ou decrescente a ordem. Para ordenar de pelo mês de aniversário utilizamos o seguinte passo: { "$sort": { "_id": 1 }, sendo o valor 1 para ordem crescente e -1 caso seja decrescente.
    Já se quisermos ordenar nosso agrupamento pela quantidade de aniversariantes utilizamos o seguinte passo: { "$sort": { "total": 1 }, sendo aqui também o valor 1 a ordem crescente e -1 decrescente


    Então podemos concluir que o Body da nossa aggregation aqui terá o seguinte formato:
{
  "resource": "customers",
  "pipeline": [
    {
      "$match": {
        "birth_date.month": {
          "$exists": true
        }
      }
    },
    {
      "$group": {
        "_id": "$birth_date.month",
        "total": {
          "$sum": 1
        },
        "birthdays": {
          "$addToSet": {
            "id": "$_id",
            "name": {
              "$concat": [
                "$name.given_name",
                " ",
                "$name.family_name"
              ]
            },
            "day": "$birth_date.day",
            "email": "$main_email"
          }
        }
      }
    },
    {
      "$sort": {
        "total": -1
      }
    }
  ]
}

OBS.: O operador $addToSet irá montar a lista de aniversariantes daquele mês conforme as propriedades requeridas.
Já o operador $concat irá concatenar o o given name e o family name do customer na propriedade name do aniversariante.

Para saber mais sobre esse operadores $addToSet, $concat e outros, você pode consultar a documentação do MongoDB.


RESULTADO DA AGGREGATION


A nossa aggregation realizada, produzirá um resultado semelhante ao seguir:

{
   "result": [
       {
           "_id": 7,
           "total": 4,
           "birthdays": [
               {
                   "id": "617036cf8f01d31b484d5b07",
                   "name": "José Silva",
                   "day": 11,
                   "email": "[email protected]"
               },
               {
                   "id": "6168c335aa3cee3e33f5e275",
                   "name": "João Souza",
                   "day": 15,
                   "email": "[email protected]"
               },
               {
                   "id": "616898d628ace502aea677e0",
                   "name": "Maria Almeida",
                   "day": 20,
                   "email": "[email protected]"
               },
               {
                   "id": "616876fa28ace502aea5ece1",
                   "name": "Luís Abreu",
                   "day": 24,
                   "email": "[email protected]"
               }
           ]
       },
       {
           "_id": 10,
           "total": 2,
           "birthdays": [
               {
                   "id": "62b34b88eb85911216601aa8",
                   "name": "Juliana Alves",
                   "day": 19,
                   "email": "[email protected]"
               },
               {
                   "id": "621781e57963422eee198e7f",
                   "name": "Ricardo Alves",
                   "day": 22,
                   "email": "[email protected]"
               }
           ]
       },
       {
           "_id": 12,
           "total": 1,
           "birthdays": [
               {
                   "id": "5f8a4ee5b2161709fa40162b",
                   "name": "Uilton Duarte",
                   "day": 1,
                   "email": "[email protected]"
               }
           ]
       },
       {
           "_id": 1,
           "total": 1,
           "birthdays": [
               {
                   "id": "6166d57d28ace502aea2f0b0",
                   "name": "Fabiana Sousa",
                   "day": 22,
                   "email": "[email protected]"
               }
           ]
       },
       {
           "_id": 11,
           "total": 1,
           "birthdays": [
               {
                   "id": "618d54f3deb21f68645f85bd",
                   "name": "Jose  Pereira",
                   "day": 11,
                   "email": "[email protected]"
               }
           ]
       }
   ]
}

Percebemos que o result é uma lista no qual contém no _id o número referente ao mês de aniversário, o total se refere a quantidade de aniversariantes daquele mês e birthdays é a lista dos aniversariantes daquele mês, contendo as informações que solicitamos na requisição.

E é isso :sunglasses:, espero que essa aggregation possa contribuir ainda mais para vocês.
Até breve :raising_hand_man:t5:.

4 curtidas

@Matheus da pra colocar isso no painel ? hehehe

Vai ser colocado. Essa ideia de post já é pensando nisso.

1 curtida