Menu Docs
Página inicial do Docs
/ / /
Controlador Node.js
/

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 de desconfiguração para remover campos desnecessários
  • Executar o pipeline de agregação
  • Interpretar resultados

Neste tutorial, você pode aprender a usar o driver Node.js para construir um pipeline de agregação, executar a agregação em uma coleção e imprimir os resultados concluindo e executando um aplicativo de exemplo. Essa agregação executa as seguintes operações:

  • Corresponde a um subconjunto de documentos por um valor de campo

  • Agrupa documentos por valores de campo comuns

  • Adiciona campos calculados a cada documento de resultado

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 iniciar este tutorial, conclua as instruções do Aplicativo modelo de agregação para configurar um aplicativo Node.js funcional.

Após configurar o aplicativo, acesse a coleção orders adicionando o seguinte código ao aplicativo:

const ordersColl = await 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);
1

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"),
},
},
});
2

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,
},
});
3

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 cliente

  • total_value: o valor total de todas as compras do cliente

  • total_orders: o número total de compras do cliente

  • orders: 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"
}
},
},
});
4

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,
},
});
5

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",
},
});
6

Finalmente, adicione um estágio $unset . O estágio $unset remove o campo _id dos documentos de resultado:

pipeline.push({ $unset: ["_id"] });
7

Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection orders :

const aggregationResult = await ordersColl.aggregate(pipeline);

Por fim, execute o seguinte comando em seu shell para iniciar seu aplicativo:

node agg_tutorial.js
8

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.

← Subconjunto filtrado