Como criar agrupamentos de dados, Aggregation

Nesse tópico iremos falar de alguns conceitos um pouco mais técnicos, então prepare seu café :coffee: e vamos lá…… :rocket: :rocket:

Nossa API possui inúmeras funcionalidades e uma delas é a Aggregation. As Aggregations, são operações onde podemos agrupar dados e gerar resultados conforme as nossas necessidades. Neste tópico vamos criar uma Aggregation para encontrar a quantidade de clientes que fazem aniversário em cada mês e ordenar os meses por ordem decrescente da quantidade de aniversariantes.

Primeiramente, iremos precisar de um software que irá realizar as nossas requisições para a API, recomendamos o uso do Hoppscotch (https://hoppscotch.io/).

Antes de realizarmos a nossa requisição de aggregation iremos precisar de algumas informações importantes. Como o seu ID da loja, ID da sua autenticação, API Key e o token

Vá até o seu painel administrativo da E-com Plus :purple_heart: (https://app.e-com.plus), faça o login normalmente e clique com o botão direito do mouse em qualquer lugar do painel e em seguida clique em Inspecionar.

Logo após clique na aba console, nela você terá as seguintes informações: ID da sua autenticação e ID da Loja, nessa ordem respectivamente.


PASSO 1: LOGIN

De posse dessa informação vamos a nossa primeira requisição :wink: , a requisição de login, através dela iremos capturar a informação API Key.

Tela do Hoppscotch


Vamos Selecionar o método POST, na seguinte url: https://api.e-com.plus/v1/_login.json

Na aba body vamos precisar informar o username e a senha convertida em hash md5 ( os mesmos dados utilizados para acessar o painel administrativo), no seguinte formato:

{
    "username":"seuusername", 
    "pass_md5_hash": "11111111111111111111111111111111"
}

Obs.:

  • Caso você opte por realizar o login com o e-mail, basta substituir o username pelo e- mail, ficaria assim:
{
    "email":"[email protected]",
    "pass_md5_hash": "11111111111111111111111111111111"
}

Na aba Header, será necessário adicionar os seguintes valores, conforme a imagem a seguir:

  • X-Store-ID: Id_da_sua_loja


Feito todos os passos anteriores, agora é só clicar em Send (enviar).

Se tudo estiver ocorrido conforme o esperado, você receberá a resposta no seguinte formato:

{
  "_id": "Id_da_sua_autenticacao",
  "store_id": id_da_sua_loja,
  "api_key": "sua_api_api"
}

Obs.: Lembre-se de salvar as informações que iremos precisar para as próximas requisições, até esse passo já possuímos o ID da loja, ID da sua autenticação e API Key.


PASSO 2: GERAR TOKEN

Neste passo iremos gerar o nosso token, para que consigamos realizar, qualquer operação dentro da nossa loja, utilizando a API. :star_struck:

Vamos continuar a utilizar o método POST, na url: https://api.e-com.plus/v1/_authenticate.json e iremos manter as informações do header utilizados na requisição anterior.

Já no body, vamos passar as seguintes informações neste formato:

{
  "_id": "Id_da_sua_autenticacao",
  "api_key": "sua_api_api"
}

E novamente se tudo ocorreu conforme o esperado receberemos a seguinte resposta:

{
  "my_id": "Id_da_sua_autenticacao",
  "access_token": "seu_token_atualizado",
  "expires": "validade_do_token"
}

Obs.: Neste passo teremos todas as informações necessárias ( ID da loja, ID da sua autenticação, API Key e o token) para realizarmos todas as operações dentro da API, inclusive a operação de aggregation.


PASSO 3: AGGREGATION

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

Na aba Header, será necessário adicionar os seguintes valores:

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

O segredo das aggregation está no body onde vamos precisar de duas propriedade importantes: o resource, para informar qual recurso ( colletion ou tabela) iremos analisar e o pipeline, sendo esse um conjunto dos estágios da nossa operação.

Mas vamos ao que interessa :grimacing:, como a nossa proposta inicial é de encontrar a quantidade de clientes que fazem aniversário em cada mês e ordenar os meses por ordem decrescente da quantidade de aniversariantes.

Nosso body ficará no seguinte formato:

{
  "resource" : "customers",
  "pipeline" : [
    { "$match": { "birth_date.month": { "$exists": true } } }, // estágio 1
    { "$group": { "_id": "$birth_date.month", "total": { "$sum": 1 }}}, // estágio 2
    { "$sort": { "total": -1 } // estágio 3
   }
  ]
 }

Obs.: Não utilize os comentários nas requisições.

Vemos aqui que iremos analisar a resource customers, na qual está armazenada as informações de nossos clientes, sendo uma delas a data de nascimento dos mesmos.

  1. No primeiro estágio de nosso pipeline { "$match": { "birth_date.month": { "$exists": true } } },
    Verificamos se o customers cadastrou a data de nascimento, sendo mais específico se tem cadastrado o mês de seu nascimento, mas aqui poderíamos verificar se o usuário é ativo utilizando no lugar, o seguinte: { "$match": { "enabled": {"$eq": true} }},
    Ou ainda, todos os cliente que cadastram a data de nascimento e estão ativos utilizando o seguinte: { "$match": { "birth_date.month": { "$exists": true } , "enabled": {"$eq": true} }},

  2. Já o segundo estágio é o agrupamento, onde iremos contabilizar a quantidade de clientes que nasceram em cada mês, passando como parâmetro para o _id do agrupamento o mês de nascimento e o total a contagem (soma) de cada cliente. { "$group": { "_id": "$birth_date.month", "total": { "$sum": 1 }}},

  3. E para finalizarmos esta aggregation a nossa ordenação, onde passamos como parâmetro de ordenação a propriedade total, obtida no estágio anterior. O valor -1 é para informar que a ordenação deverá ser em ordem decrescente.
    Para refinar ainda mais nossa ordenação podemos acrescentar outros parâmetros, como por exemplo ordenar por mês em caso de empate no número total de clientes, ficando assim o nosso estágio de ordenação: { "$sort": { "total": -1 , "_id":1}, veja que aqui passamos o parâmetro _id obtido no estágio anterior, que representa o valor do mês de nascimento.

Caso esteja tudo correto, a resposta desta solicitação seguirá o seguinte formato conforme o exemplo abaixo:

{
  "result": [
    {
      "_id": 7,
      "total": 4
    },
    {
      "_id": 10,
      "total": 1
    },
    {
      "_id": 12,
      "total": 1
    },
    {
      "_id": 1,
      "total": 1
    },
    {
      "_id": 11,
      "total": 1
    }
  ]
}

Entendendo a resposta: Neste exemplo de resposta podemos analisar que no mês 7 (Julho) temos 4 cliente que faz aniversário, já no mês 10 (Outubro) apenas um cliente e o mesmo valor para os meses 1 (Janeiro) e 11 ( Novembro), perceba que essa resposta a ordenação não foi refinada, mas caso seja, a resposta terá o seguinte formato:

{
  "result": [
    {
      "_id": 7,
      "total": 4
    },
    {
      "_id": 1,
      "total": 1
    },
    {
      "_id": 10,
      "total": 1
    },
    {
      "_id": 11,
      "total": 1
    },
    {
      "_id": 12,
      "total": 1
    }
  ]
}

Espero que esse tópico possa ajudar vocês a criarem suas próprias aggregations em nossa API. :wink:

3 curtidas