Grupo e total
Nesta página
- Introdução
- Resumo da tarefa de agregação
- Antes de começar
- Tutorial
- Adicione um estágio de correspondência para pedidos em 2020
- Adicione um estágio de classificação para classificar por data do pedido
- Adicione um estágio de grupo para agrupar por endereço de e-mail
- Adicione um estágio de classificação para classificar por data do primeiro pedido
- Adicione um estágio de conjunto para exibir o endereço de e-mail
- Adicione um estágio não definido para remover campos desnecessários
- Executar o pipeline de agregação
- Interpretar resultados
Introdução
Neste tutorial, você pode aprender a usar o driver Node.js para criar um pipeline de agregação, realizar a agregação em uma coleção e imprimir os resultados concluindo e executando um aplicativo de amostra. Esta agregação executa as seguintes operações:
Corresponde a um subconjunto de documentos pelo valor de um campo
Agrupa documentos por valores de campo comuns
Adiciona campos calculados a cada documento de resultado
Resumo da tarefa de agregação
Este tutorial demonstra como agrupar e analisar dados de pedido de cliente. Os resultados mostram a lista de clientes que compraram itens em 2020 e incluem o histórico de pedidos de cada cliente para 2020.
Este exemplo utiliza uma collection, orders
, que contém documento que descrevem pedidos de produtos individuais. Como cada pedido pode corresponder a apenas um cliente, os documentos do pedido são agrupados pelo campo customer_id
, que contém os endereços de e-mail do cliente.
Antes de começar
Antes de iniciar este tutorial, conclua as instruções do Aggregation Template App para configurar um aplicação Node.js de trabalho.
Depois de configurar o aplicativo, acesse a coleção orders
adicionando o seguinte código ao aplicativo:
const ordersColl = aggDB.collection("orders");
Exclua quaisquer dados existentes e insira dados de amostra na coleção orders
como mostrado no seguinte código:
await ordersColl.deleteMany({}); const orderData = [ { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-05-30T08:35:52Z"), value: 231, }, { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-01-13T09:32:07Z"), value: 99, }, { customer_id: "oranieri@warmmail.com", orderdate: new Date("2020-01-01T08:25:37Z"), value: 63, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2019-05-28T19:13:32Z"), value: 2, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2020-11-23T22:56:53Z"), value: 187, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2020-08-18T23:04:48Z"), value: 4, }, { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-12-26T08:55:46Z"), value: 4, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2021-02-29T07:49:32Z"), value: 1024, }, { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-10-03T13:49:44Z"), value: 102, }, ]; await ordersColl.insertMany(orderData);
Tutorial
Adicione um estágio de correspondência para pedidos em 2020
Primeiro, adicione um estágio $match que corresponda aos pedidos feitos em 2020:
pipeline.push({ $match: { orderdate: { $gte: new Date("2020-01-01T00:00:00Z"), $lt: new Date("2021-01-01T00:00:00Z"), }, }, });
Adicione um estágio de classificação para classificar por data do pedido
Em seguida, adicione um estágio $sort para definir uma classificação ascendente no campo orderdate
para exibir a primeira compra 2020 para cada cliente no próximo estágio:
pipeline.push({ $sort: { orderdate: 1, }, });
Adicione um estágio de grupo para agrupar por endereço de e-mail
Adicione um estágio $group para agrupar pedidos pelo valor do campo customer_id
. Nesta etapa, adicione operações de agregação que criam os seguintes campos nos documentos de resultado:
first_purchase_date
: a data da primeira compra do clientetotal_value
: o valor total de todas as compras do clientetotal_orders
: o número total de compras do clienteorders
: a lista de todas as compras do cliente, incluindo a data e o valor de cada compra
pipeline.push({ $group: { _id: "$customer_id", first_purchase_date: { $first: "$orderdate" }, total_value: { $sum: "$value" }, total_orders: { $sum: 1 }, orders: { $push: { orderdate: "$orderdate", value: "$value" } }, }, });
Adicione um estágio de classificação para classificar por data do primeiro pedido
Em seguida, adicione outro estágio $sort para definir uma classificação ascendente no campo first_purchase_date
:
pipeline.push({ $sort: { first_purchase_date: 1, }, });
Adicione um estágio de conjunto para exibir o endereço de e-mail
Adicione um estágio $set para recriar o campo customer_id
a partir dos valores no campo _id
que foram definidos durante o estágio $group
:
pipeline.push({ $set: { customer_id: "$_id", }, });
Adicione um estágio não definido para remover campos desnecessários
Finalmente, adicione um estágio $unset . O estágio $unset
remove o campo _id
dos documentos de resultado:
pipeline.push({ $unset: ["_id"] });
Interpretar resultados
A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020:
{ first_purchase_date: 2020-01-01T08:25:37.000Z, total_value: 63, total_orders: 1, orders: [ { orderdate: 2020-01-01T08:25:37.000Z, value: 63 } ], customer_id: 'oranieri@warmmail.com' } { first_purchase_date: 2020-01-13T09:32:07.000Z, total_value: 436, total_orders: 4, orders: [ { orderdate: 2020-01-13T09:32:07.000Z, value: 99 }, { orderdate: 2020-05-30T08:35:52.000Z, value: 231 }, { orderdate: 2020-10-03T13:49:44.000Z, value: 102 }, { orderdate: 2020-12-26T08:55:46.000Z, value: 4 } ], customer_id: 'elise_smith@myemail.com' } { first_purchase_date: 2020-08-18T23:04:48.000Z, total_value: 191, total_orders: 2, orders: [ { orderdate: 2020-08-18T23:04:48.000Z, value: 4 }, { orderdate: 2020-11-23T22:56:53.000Z, value: 187 } ], customer_id: 'tj@wheresmyemail.com' }
Os documentos de resultados contêm detalhes de todos os pedidos de um determinado cliente, agrupados pelo endereço de e-mail do cliente.
Para visualizar o código completo deste tutorial, consulte o Aplicativo Concluído e Total no Github.