解包数组并分组
本页内容
简介
在本教程中,您可以通过完成并运行一个示例应用程序,学习如何使用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);
教程
添加一个展开阶段以展开产品订单数组
首先,添加一个$unwind 阶段,将 products
数组中的条目拆分成单独的文档
pipeline.push({ $unwind: { path: "$products", }, });
添加一个匹配阶段以匹配价格超过 $15 的产品
接下来,添加一个 $match 阶段,匹配具有 products.price
值大于 15
的产品
pipeline.push({ $match: { "products.price": { $gt: 15, }, }, });
为按产品类型分组添加一个分组阶段
在按 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 }, }, });
添加一个
添加一个 $set 阶段以从在 $group
阶段中设置的 _id
字段值中重新创建 product_id
字段
pipeline.push({ $set: { product_id: "$_id", }, });
添加一个
最后,添加一个 $unset 阶段。该 $unset
阶段将结果文档中的 _id
字段删除
pipeline.push({ $unset: ["_id"] });
解读结果
聚合返回了以下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上的完成的解包数组应用。