文档菜单

文档首页开发应用程序Python 驱动程序PyMongo

拆包数组并分组

本页内容

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

在本教程中,您可以通过完成并运行一个示例应用程序来学习如何使用 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)
1

首先,添加一个$unwind阶段,将products数组中的条目分离成单独的文档

pipeline.append({
"$unwind": {
"path": "$products"
}
})
2

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

pipeline.append({
"$match": {
"products.price": {
"$gt": 15
}
}
})
3

添加一个$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}
}
})
4

添加一个 $set 阶段,用于从 _id 字段中设置的值重新创建 product_id 字段

pipeline.append({
"$set": {
"product_id": "$_id"
}
})
5

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

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

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

aggregation_result = orders_coll.aggregate(pipeline)

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

python3 agg_tutorial.py
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 上的 完成的 Unpack Arrays 应用程序

← 分组和总计