文档首页 → 开发应用程序 → Python 驱动程序 → PyMongo
拆包数组并分组
本页内容
简介
在本教程中,您可以通过完成并运行一个示例应用程序来学习如何使用 PyMongo 构建聚合管道,在一个集合上执行聚合并打印结果。此聚合执行以下操作
将数组字段展开到单独的文档中
通过字段值匹配文档子集
按共同字段值对文档进行分组
向每个结果文档添加计算字段
聚合任务概述
本教程演示了如何从客户订单数据中创建洞察。结果显示了订单列表,其中包含价格超过15美元的产品,并且每个文档都包含每个产品的销售单元数和总销售价值。
此示例使用一个集合,orders
,其中包含描述产品订单的文档。由于每个订单包含多个产品,聚合的第一步是将products
数组拆分为单独的产品订单文档。
开始之前
在开始本教程之前,请完成聚合模板应用程序说明,以设置可工作的Python应用程序。
设置应用程序后,通过在应用程序中添加以下代码来访问orders
集合
orders_coll = agg_db["orders"]
删除任何现有数据,并将以下代码中的示例数据插入到orders
集合中
orders_coll.delete_many({}) order_data = [ { "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, } ] } ] orders_coll.insert_many(order_data)
教程
添加一个unwind阶段来拆分产品订单数组
首先,添加一个$unwind阶段,将products
数组中的条目分离成单独的文档
pipeline.append({ "$unwind": { "path": "$products" } })
添加一个匹配阶段以匹配价格超过15美元的产品
接下来,添加一个$match阶段,以匹配具有products.price
值大于15
的产品
pipeline.append({ "$match": { "products.price": { "$gt": 15 } } })
添加一个分组阶段按产品类型分组
添加一个$group阶段,按prod_id
字段的值对订单进行分组。在此阶段中,添加以下字段的聚合操作
product
:产品名称total_value
:所有产品销售的总价值quantity
:产品的订单数量
pipeline.append({ "$group": { "_id": "$products.prod_id", "product": {"$first": "$products.name"}, "total_value": {"$sum": "$products.price"}, "quantity": {"$sum": 1} } })
添加一个设置阶段来显示产品ID
添加一个 $set 阶段,用于从 _id
字段中设置的值重新创建 product_id
字段
pipeline.append({ "$set": { "product_id": "$_id" } })
添加一个
unset 阶段来删除不需要的字段
最后,添加一个 $unset 阶段。该 $unset
阶段将从结果文档中删除 _id
字段
pipeline.append({"$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 上的 完成的 Unpack Arrays 应用程序