文档菜单
文档首页
/ / /
C++ 驱动程序

使用聚合转换数据

本页面内容

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

在本指南中,您可以了解如何使用C++驱动程序执行 聚合操作

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

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

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

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

  • 选择要返回的文档

  • 选择要返回的字段

  • 排序结果

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

  • 运行查找操作

  • 重命名字段

  • 计算字段

  • 总结数据

  • 分组值

使用聚合操作时请注意以下限制

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

  • 默认情况下,管道阶段的内存限制为100兆字节。您可以通过将allow_disk_use字段设置为true来超过此限制。allow_disk_use字段为mongocxx::options::aggregate实例设置为true

重要

$graphLookup 异常

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

注意

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

要执行聚合,请将包含聚合阶段的mongocxx::pipeline实例传递给collection.aggregate()方法。

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

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

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

mongocxx::pipeline stages;
stages.match(make_document(kvp("cuisine", "Bakery")))
.group(make_document(kvp("_id", "$borough"), kvp("count", make_document(kvp("$sum", 1)))));
auto cursor = collection.aggregate(stages);
for (auto&& doc : cursor) {
std::cout << bsoncxx::to_json(doc) << std::endl;
}
{ "_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执行的计划和任何拒绝的执行计划。

要解释聚合操作,通过在BSON文档中指定命令并作为参数传递给run_command()方法来运行explain数据库命令。

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

mongocxx::pipeline stages;
stages.match(make_document(kvp("cuisine", "Bakery")))
.group(make_document(kvp("_id", "$borough"), kvp("count", make_document(kvp("$sum", 1)))));
auto command = make_document(
kvp("explain", make_document(
kvp("aggregate", "restaurants"),
kvp("pipeline", stages.view_array()),
kvp("cursor", make_document()))));
auto result = db.run_command(command.view());
std::cout << bsoncxx::to_json(result) << std::endl;
{ "explainVersion" : "2", "queryPlanner" : { "namespace" : "sample_restaurants.restaurants",
"indexFilterSet" : false, "parsedQuery" : { "cuisine" : { "$eq" : "Bakery" } }, "queryHash":
"...", "planCacheKey" : "...", "optimizedPipeline" : true, "maxIndexedOrSolutionsReached":
false, "maxIndexedAndSolutionsReached" : false, "maxScansToExplodeReached" : false,
"winningPlan" : { ... }
... }

要查看表达式运算符的完整列表,请参阅聚合运算符。

了解如何组装聚合管道和查看示例,请参阅聚合管道。

了解更多关于创建管道阶段的资料,请参阅聚合阶段。

了解更多关于解释MongoDB操作的资料,请参阅Explain 输出查询计划。

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

返回

Atlas 搜索索引

© . All rights reserved.