文档菜单
文档首页
/ / /
Kotlin 同步驱动器

使用聚合转换您的数据

本页内容

  • 概述
  • 比较聚合与查找操作
  • 限制
  • 聚合示例
  • 构建并执行聚合管道
  • 解释聚合
  • 附加信息
  • API 文档

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

您可以使用聚合操作来处理 MongoDB 集合中的数据,并返回计算结果。MongoDB 聚合框架是查询 API 的一部分,它基于数据处理管道的概念。文档进入一个包含一个或多个阶段的管道,每个阶段都转换文档以输出最终的聚合结果。

您可以将聚合操作视为类似于汽车工厂。汽车工厂有一条装配线,其中包含装配站和专用工具,用于执行特定的工作,如钻孔和焊接。原材料进入工厂,然后装配线将其转换和组装成成品。

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

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

  • 选择要返回的文档

  • 选择要返回的字段

  • 排序结果

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

  • 执行查找操作

  • 重命名字段

  • 计算字段

  • 汇总数据

  • 分组值

使用聚合操作时,以下限制适用

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

  • 默认情况下,管道阶段具有100兆字节的内存限制。您可以通过使用allowDiskUse()方法从AggregateIterable类来超过此限制。

重要

$graphLookup异常

具有严格100兆字节内存限制的$graphLookup阶段会忽略allowDiskUse选项。

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

以下Kotlin数据类模型表示此集合中的文档

data class Restaurant(
val name: String,
val cuisine: String,
val borough: String
)

要对集合中的文档进行聚合,请将聚合阶段列表传递给aggregate()方法。

以下示例输出纽约市每个区面包店的数量。以下代码创建了一个包含以下阶段的聚合管道:

  • 一个用于过滤 cuisine 字段值为 "Bakery" 的文档的 $match 阶段。

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

val pipeline = listOf(
Aggregates.match(Filters.eq(Restaurant::cuisine.name, "Bakery")),
Aggregates.group("\$borough", Accumulators.sum("count", 1))
)
val results = collection.aggregate<Document>(pipeline)
results.forEach { result ->
println(result)
}
Document{{_id=Bronx, count=71}}
Document{{_id=Manhattan, count=221}}
Document{{_id=Brooklyn, count=173}}
Document{{_id=Queens, count=204}}
Document{{_id=Staten Island, count=20}}
Document{{_id=Missing, count=2}}

提示

在指定 $group 聚合阶段的分组键时,请确保使用反斜杠字符(\)转义任何 $ 字符。

要查看 MongoDB 执行操作的信息,您可以在管道中包含 $explain 聚合阶段。当 MongoDB 解释一个操作时,它返回 执行计划 和性能统计信息。执行计划是 MongoDB 完成操作的可能方式之一。当您指示 MongoDB 解释操作时,它将返回为操作选择的计划以及任何被拒绝的执行计划。

以下代码示例运行了前面部分中显示的相同聚合操作,并添加了 $explain 阶段以输出操作细节

print(collection.aggregate(pipeline).explain())
{
"explainVersion": "2",
"queryPlanner": {
"namespace": "sample_restaurants.restaurants"
"indexFilterSet": false,
"parsedQuery": {
"cuisine": {"$eq": "Bakery"}
},
"queryHash": "865F14C3",
"planCacheKey": "0697561B",
"optimizedPipeline": true,
"maxIndexedOrSolutionsReached": false,
"maxIndexedAndSolutionsReached": false,
"maxScansToExplodeReached": false,
"winningPlan": { ... }
...
}
...
}

要查看表达式运算符的完整列表,请参阅 MongoDB 服务器手册中的 聚合运算符

要了解如何组装聚合管道并查看示例,请参阅 MongoDB 服务器手册中的 聚合管道

要了解更多关于创建管道阶段的信息,请参阅 MongoDB 服务器手册中的 聚合阶段

要了解更多关于解释MongoDB操作的信息,请参阅MongoDB服务器手册中的Explain输出查询计划

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

返回

Atlas & Vector Search