文档菜单
文档首页
/ / /
Node.js 驱动
/

解包数组并分组

本页内容

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

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

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

  • 通过字段值匹配文档的子集

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

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

本教程演示了如何从客户订单数据中提取洞察。结果显示了价值超过15美元的产品订单列表,每个文档包含每个产品的销售数量和总销售额。

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

在开始本教程之前,请完成以下聚合模板应用程序说明以设置可工作的Node.js应用程序。

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

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

删除任何现有数据,并按照以下代码将示例数据插入到 orders 集合中

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

在按 prod_id 字段值分组的 $group 阶段中添加聚合操作。在此阶段,添加以下字段到结果文档中的聚合操作

  • 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

将以下代码添加到您的应用程序末尾以在 orders 集合上执行聚合

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美元的产品的订单总价值和数量的详细信息

要查看本教程的完整代码,请参阅GitHub上的完成的解包数组应用

返回

分组和总计