通过聚合转换数据
Overview
在本指南中,您可以了解如何使用 PyMongo 执行聚合操作。
聚合操作处理 MongoDB 集合中的数据并返回计算结果。 MongoDB 聚合框架是 Query API 的一部分,以数据处理管道的概念为模型。 文档进入包含一个或多个阶段的管道,该管道将文档转换为聚合结果。
聚合操作类似于汽车工厂。汽车工厂有一条装配线,其中包含配备专用工具的装配站,用于完成特定的工作,例如钻机和焊机。毛坯零件会进入工厂,然后装配线将其转换并组装为成品。
聚合管道是装配线,聚合阶段是装配站,操作符表达式则是专用工具。
聚合与查找操作
您可以使用查找操作执行以下动作:
选择要返回的文档
选择要返回的字段
对结果进行排序
您可以使用聚合操作执行以下动作:
执行查找操作
重命名字段
计算字段
汇总数据
对值进行分组
限制
使用聚合操作时,请记住以下限制:
返回的文档不得违反 BSON 文档大小限制(16 兆字节)。
默认情况下,管道阶段的内存限制为100 MB。 您可以使用
aggregate()
方法的allowDiskUse
关键字参数来超出此限制。
聚合示例
注意
此示例使用Atlas示例数据集中的sample_restaurants.restaurants
集合。 要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅 PyMongo入门。
如需执行聚合,请向 collection.aggregate()
方法传递聚合阶段列表。
以下代码示例计算纽约每个区的面包店数量。 为此,它使用具有以下阶段的聚合管道:
# Define an aggregation pipeline with a match stage and a group stage pipeline = [ { "$match": { "cuisine": "Bakery" } }, { "$group": { "_id": "$borough", "count": { "$sum": 1 } } } ] # Execute the aggregation aggCursor = collection.aggregate(pipeline) # Print the aggregated results for document in aggCursor: print(document)
前面的代码示例生成类似于以下内容的输出:
{'_id': 'Bronx', 'count': 71} {'_id': 'Brooklyn', 'count': 173} {'_id': 'Missing', 'count': 2} {'_id': 'Manhattan', 'count': 221} {'_id': 'Queens', 'count': 204} {'_id': 'Staten Island', 'count': 20}
解释聚合
要查看有关 MongoDB 如何执行您的操作的信息,您可以指示 MongoDB 进行解释。 MongoDB 解释操作时,会返回执行计划和性能统计信息。 执行计划是 MongoDB 完成操作的一种潜在方式。 当您指示 MongoDB 解释一个操作时,它会返回 MongoDB 执行的计划和任何被拒绝的执行计划。
要解释聚合操作,您可以使用 PyMongoExplain 库或数据库命令。选择下面相应的标签页,查看每种方法的示例。
使用 pip 安装pymongoexplain
库,如以下示例所示:
python3 -m pip install pymongoexplain
以下代码示例运行前面的聚合示例并打印MongoDB返回的解释:
# Define an aggregation pipeline with a match stage and a group stage pipeline = [ { "$match": { "cuisine": "Bakery" } }, { "$group": { "_id": "$borough", "count": { "$sum": 1 } } } ] # Execute the operation and print the explanation result = ExplainableCollection(collection).aggregate(pipeline) print(result)
... 'winningPlan': {'queryPlan': {'stage': 'GROUP', 'planNodeId': 3, 'inputStage': {'stage': 'COLLSCAN', 'planNodeId': 1, 'filter': {'cuisine': {'$eq': 'Bakery'}}, 'direction': 'forward'}}, ...
以下代码示例运行前面的聚合示例并打印MongoDB返回的解释:
# Define an aggregation pipeline with a match stage and a group stage pipeline = [ { $match: { cuisine: "Bakery" } }, { $group: { _id: "$borough", count: { $sum: 1 } } } ] # Execute the operation and print the explanation result = database.command("aggregate", "collection", pipeline=pipeline, explain=True) print(result)
... 'command': {'aggregate': 'collection', 'pipeline': [{'$match': {'cuisine': 'Bakery'}}, {'$group': {'_id': '$borough', 'count': {'$sum': 1}}}], 'explain': True, ...
提示
您可以使用 Python 的pprint
模块使解释结果更易于阅读:
import pprint ... pprint.pp(result)
更多信息
MongoDB Server 手册
要查看表达式操作符的完整列表,请参阅聚合操作符。
要了解如何组装聚合管道并查看示例,请参阅聚合管道。
要了解有关创建管道阶段的更多信息,请参阅聚合阶段。
聚合教程
要查看常见聚合任务的分步说明,请参阅以下教程:
聚合教程以分步格式提供了常见聚合任务的详细说明。本教程改编自 Paul Done 所著《实用 MongoDB 聚合》(Practical MongoDB Aggregations)一书中的示例。
每个教程都包括以下部分:
简介,描述聚合类型的用途和常见用例。本节还描述了本教程演示的示例和预期结果。
开始之前,这个部分介绍了在构建聚合管道和执行聚合之前必须具备的必要数据库、集合和示例数据。
教程,其中介绍了如何构建和运行聚合管道。本节介绍已完成聚合教程的每个阶段,然后说明如何运行和解释聚合的输出结果。
在每个聚合教程的最后,您都可以找到一个链接,指向完全可运行的 Python 代码文件,您可以在自己的环境中运行该文件。
API 文档
有关使用 PyMongo 执行聚合操作的更多信息,请参阅以下 API 文档: