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:
-
Aggregation: Onde mostramos um passo a passo de como quantificar os aniversariantes de cada mês.
-
Aggregation, para lista de produtos mais pedidos em um determinado período.
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é ? Então vamos lá…….
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.
As aggregations são requisições na URL (ou endpoint) https://api.e-com.plus/v1/$aggregate.json da nossa API 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 , 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 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 , espero que essa aggregation possa contribuir ainda mais para vocês.
Até breve .