文档菜单
文档首页
/ / /
PHP 库手册

使用聚合转换您的数据

本页内容

  • 概述
  • 聚合操作与查找操作比较
  • 限制
  • 聚合示例
  • 解释聚合操作
  • 附加信息
  • MongoDB服务器手册
  • API文档

在本指南中,您可以学习如何使用MongoDB PHP库执行聚合操作

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

聚合操作类似于汽车工厂。汽车工厂有一条装配线,装配线包含装配站和专用工具来完成特定的工作,如钻孔和焊接。原始零件进入工厂,然后装配线将其转换和组装成成品。

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

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

  • 选择要返回的文档

  • 选择要返回的字段

  • 排序结果

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

  • 运行查找操作

  • 重命名字段

  • 计算字段

  • 汇总数据

  • 分组值

执行聚合操作时,请考虑以下限制

  • 返回的文档不能违反BSON文档大小限制为16兆字节。

  • 默认情况下,管道阶段的内存限制为100兆字节。您可以通过创建一个设置allowDiskUse选项为true的选项数组并传递给MongoDB\Collection::aggregate()方法来超出此限制。allowDiskUse选项

    重要

    $graphLookup异常

    $graphLookup阶段有一个严格的100兆字节内存限制,并忽略allowDiskUse选项。

注意

本指南中的示例使用的是来自Atlas样本数据集sample_restaurants数据库中的restaurants集合。有关如何创建免费的MongoDB Atlas集群并加载样本数据集的说明,请参阅Atlas入门指南

要执行聚合,请将包含管道阶段的数组传递给MongoDB\Collection::aggregate()方法。

以下代码示例生成纽约每个区面包店的数量。为此,它使用包含以下阶段的聚合管道

  • $match阶段以过滤包含cuisine字段值为'Bakery'的文档

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

$pipeline = [
['$match' => ['cuisine' => 'Bakery']],
['$group' => ['_id' => '$borough', 'count' => ['$sum' => 1]]],
];
$cursor = $collection->aggregate($pipeline);
foreach ($cursor as $doc) {
echo json_encode($doc), PHP_EOL;
}
{"_id":"Brooklyn","count":173}
{"_id":"Queens","count":204}
{"_id":"Bronx","count":71}
{"_id":"Staten Island","count":20}
{"_id":"Missing","count":2}
{"_id":"Manhattan","count":221}

要查看MongoDB执行操作的信息,您可以指示MongoDB查询规划器来解释它。当MongoDB解释一个操作时,它返回执行计划和性能统计数据。执行计划是MongoDB完成操作的可能方式。当您指示MongoDB解释一个操作时,它返回MongoDB执行的计划以及任何拒绝的执行计划。

要解释聚合操作,构建一个MongoDB\Operation\Aggregate对象,并将数据库名、集合和管道阶段作为参数传递。然后,将MongoDB\Operation\Aggregate对象传递给MongoDB\Collection::explain()方法。

以下示例指示MongoDB解释前面的聚合示例:

$pipeline = [
['$match' => ['cuisine' => 'Bakery']],
['$group' => ['_id' => '$borough', 'count' => ['$sum' => 1]]],
];
$aggregate = new MongoDB\Operation\Aggregate(
$collection->getDatabaseName(),
$collection->getCollectionName(),
$pipeline
);
$result = $collection->explain($aggregate);
echo json_encode($result), PHP_EOL;
{"explainVersion":"2","queryPlanner":{"namespace":"sample_restaurants.restaurants",
"indexFilterSet":false,"parsedQuery":{"cuisine":{"$eq":"Bakery"}},"queryHash":"865F14C3",
"planCacheKey":"D56D6F10","optimizedPipeline":true,"maxIndexedOrSolutionsReached":false,
"maxIndexedAndSolutionsReached":false,"maxScansToExplodeReached":false,"winningPlan":{
... }

要查看使用MongoDB PHP库创建复杂聚合管道的教程,请参阅MongoDB开发者中心中的使用纯PHP和MongoDB创建复杂聚合管道

要了解本指南中讨论的主题的更多信息,请参阅MongoDB服务器手册中的以下页面

了解更多关于本指南中讨论的方法,请参阅以下API文档

  • MongoDB\Collection::aggregate()

  • MongoDB\Collection::explain()

返回

运行数据库命令