Docs 菜单

Docs 主页开发应用程序Python 驱动程序pymongo

解压数组并进行分组

在此页面上

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

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

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

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

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

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

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

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

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

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

orders_coll = agg_db["orders"]

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

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阶段,以根据$group阶段设置的_id字段中的值重新创建product_id字段:

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

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

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

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

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

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

← 群组和总计