Docs 菜单
Docs 主页
/ / /
Node.js
/

解压数组并进行分组

在此页面上

  • 简介
  • 聚合任务摘要
  • 开始之前
  • Tutorial
  • 添加一个展开阶段来展开产品订单数组
  • 为价格超过 15 美元的产品添加匹配阶段
  • 添加小组阶段以按产品类型分组
  • 添加设置阶段以显示产品 ID
  • 添加未设置阶段以删除不需要的字段
  • 运行聚合管道
  • 解释结果

在本教程中,您可以学习如何使用 Node.js 驱动程序构建聚合管道、对集合执行聚合,以及通过完成和运行示例应用程序来打印结果。此聚合执行以下操作:

  • 将数组字段展开到单独的文档中

  • 根据字段值匹配文档子集

  • 按公共字段值对文档进行分组

  • 将计算字段添加到每个结果文档

本教程演示如何从客户订单数据中创建见解。 结果显示订购的价格超过 15 美元的产品列表,每个文档包含每个产品的销售单位数和总销售价值。

此示例使用一个collection orders ,其中包含描述产品订单的文档。由于每个订单包含多个产品,因此聚合的第一步是将products数组解包为单个产品订单文档。

在开始本教程之前,请完成聚合模板应用说明,以设立有效的 Node.js应用程序。

设置应用后,通过将以下代码添加到应用程序中来访问 orders 集合:

const ordersColl = aggDB.collection("orders");

删除所有现有数据,并将样本数据插入orders collection,如以下代码所示:

await ordersColl.deleteMany({});
const orderData = [
{
order_id: 6363763262239,
products: [
{
prod_id: "abc12345",
name: "Asus Laptop",
price: 431,
},
{
prod_id: "def45678",
name: "Karcher Hose Set",
price: 22,
},
],
},
{
order_id: 1197372932325,
products: [
{
prod_id: "abc12345",
name: "Asus Laptop",
price: 429,
},
],
},
{
order_id: 9812343774839,
products: [
{
prod_id: "pqr88223",
name: "Morphy Richards Food Mixer",
price: 431,
},
{
prod_id: "def45678",
name: "Karcher Hose Set",
price: 21,
},
],
},
{
order_id: 4433997244387,
products: [
{
prod_id: "def45678",
name: "Karcher Hose Set",
price: 23,
},
{
prod_id: "jkl77336",
name: "Picky Pencil Sharpener",
price: 1,
},
{
prod_id: "xyz11228",
name: "Russell Hobbs Chrome Kettle",
price: 16,
},
],
},
];
await ordersColl.insertMany(orderData);
1

首先,添加$unwind阶段以将products数组中的条目分隔成单个文档:

pipeline.push({
$unwind: {
path: "$products",
},
});
2

接下来,添加一个$match阶段,用于匹配products.price值大于15的产品:

pipeline.push({
$match: {
"products.price": {
$gt: 15,
},
},
});
3

添加$group阶段以按prod_id字段的值对订单进行分组。 在此阶段,添加聚合操作,在结果文档中创建以下字段:

  • product:产品名称

  • total_value:产品所有销售的总价值

  • quantity:产品的订单数

pipeline.push({
$group: {
_id: "$products.prod_id",
product: { $first: "$products.name" },
total_value: { $sum: "$products.price" },
quantity: { $sum: 1 },
},
});
4

添加$set阶段,以根据$group阶段设置的_id字段中的值重新创建product_id字段:

pipeline.push({
$set: {
product_id: "$_id",
},
});
5

最后,添加一个$unset阶段。 $unset阶段从结果文档中删除_id字段:

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

将以下代码添加到应用程序末尾,以对orderscollection执行聚合:

const aggregationResult = await ordersColl.aggregate(pipeline);

最后,在 shell 中运行以下命令以启动应用程序:

node agg_tutorial.js
7

该聚合返回 2020 年以来客户订单的以下摘要:

{
product: 'Asus Laptop',
total_value: 860,
quantity: 2,
product_id: 'abc12345'
}
{
product: 'Morphy Richards Food Mixer',
total_value: 431,
quantity: 1,
product_id: 'pqr88223'
}
{
product: 'Russell Hobbs Chrome Kettle',
total_value: 16,
quantity: 1,
product_id: 'xyz11228'
}
{
product: 'Karcher Hose Set',
total_value: 66,
quantity: 3,
product_id: 'def45678'
}

结果文档包含有关成本超过 15 美元的产品订单的总值和数量的详细信息。

要查看本教程的完整代码,请参阅已 完成的 Unpack Arrays App 在Github 上。

后退

群组和总计