Docs 菜单
Docs 主页
/ / /
pymongo

通过聚合转换数据

在此页面上

  • Overview
  • 聚合与查找操作
  • 限制
  • 聚合示例
  • 解释聚合
  • 更多信息
  • MongoDB Server 手册
  • 聚合教程
  • API 文档

在本指南中,您可以了解如何使用 PyMongo 执行聚合操作

聚合操作处理 MongoDB 集合中的数据并返回计算结果。 MongoDB 聚合框架是 Query API 的一部分,以数据处理管道的概念为模型。 文档进入包含一个或多个阶段的管道,该管道将文档转换为聚合结果。

聚合操作类似于汽车工厂。汽车工厂有一条装配线,其中包含配备专用工具的装配站,用于完成特定的工作,例如钻机和焊机。毛坯零件会进入工厂,然后装配线将其转换并组装为成品。

聚合管道是装配线,聚合阶段是装配站,操作符表达式则是专用工具。

您可以使用查找操作执行以下动作:

  • 选择要返回的文档

  • 选择要返回的字段

  • 对结果进行排序

您可以使用聚合操作执行以下动作:

  • 执行查找操作

  • 重命名字段

  • 计算字段

  • 汇总数据

  • 对值进行分组

使用聚合操作时,请记住以下限制:

  • 返回的文档不得违反 BSON 文档大小限制(16 兆字节)。

  • 默认情况下,管道阶段的内存限制为100 MB。 您可以使用aggregate()方法的 allowDiskUse关键字参数来超出此限制。

重要

$graphLookup 异常

$graphLookup阶段有100 MB 的严格内存限制,并忽略allowDiskUse参数。

注意

此示例使用Atlas 样本数据集中sample_restaurants.restaurants集合。要了解如何创建免费的 MongoDB Atlas 集群并加载样本数据集,请参阅 PyMongo 入门。

如需执行聚合,请向 collection.aggregate() 方法传递聚合阶段列表。

以下代码示例计算纽约每个区的面包店数量。 为此,它使用具有以下阶段的聚合管道:

  • $match阶段,用于筛选cuisine字段包含值"Bakery"的文档。

  • $group阶段,用于按borough字段对匹配文档进行分组,并累积每个不同值的文档计数。

# 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)

以下代码示例运行前面的聚合示例并打印 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 操作的更多信息,请参阅解释输出查询计划。

要查看常见聚合任务的分步说明,请参阅聚合教程。

有关使用 PyMongo 执行聚合操作的更多信息,请参阅以下 API 文档:

后退

聚集索引