Docs 菜单
Docs 主页
/ / /
Kotlin Sync 驱动程序

通过聚合转换数据

在本指南中,您可以学习;了解如何使用Kotlin Sync驾驶员执行聚合操作

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

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

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

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

  • 选择要返回的文档

  • 选择要返回的字段

  • 对结果进行排序

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

  • 执行查找操作

  • 重命名字段

  • 计算字段

  • 汇总数据

  • 对值进行分组

应用聚合操作时存在以下限制:

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

  • 默认,管道阶段的内存限制为100 MB。 您可以使用AggregateIterable类中的 allowDiskUse()方法来超出此限制。

重要

$graphLookup 异常

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

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

以下Kotlin数据类对此集合中的文档进行建模:

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

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

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

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

  • $ 群组阶段按borough字段对匹配文档进行群组,从而为该字段的每个非重复值生成文档计数。

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解释一个操作时,它会返回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": { ... }
...
}
...
}

您可以通过创建并运行包含以下管道阶段之一的聚合管道来执行Atlas Search查询:

  • $search

  • $searchMeta

要学习;了解有关Atlas Search管道阶段的更多信息,请参阅Atlas文档中的选择聚合管道阶段

您可以使用 Search 操作符在Atlas Search管道阶段中创建搜索条件。

Kotlin Sync驾驶员为以下操作符提供了辅助方法:

Operator
说明

从不完整输入字符串中搜索包含字符序列的单词或短语。

将两个或多个操作符组合到一个查询中。

检查字段是否与您指定的值匹配。映射到 equals()equalsNull() 方法

测试指定索引字段名称的路径在文档中是否存在。

在给定路径搜索由BSON数字、日期、布尔值、objectId、uuid 或字符串值组成的大量,并返回该字段的值等于指定大量中任意值的文档。

返回与输入文档类似的文档。

支持对数字、日期和GeoJSON point值进行查询和评分。

使用索引配置中指定的分析器搜索包含有序术语序列的文档。

支持查询索引字段和值的组合。

支持对数字、日期和字符串值进行查询和评分。映射到 numberRange()dateRange() 方法

将查询字段解释为正则表达式。

使用在索引配置中指定的分析器执行全文搜索。

启用在搜索字符串中使用可匹配任何字符的特殊字符的查询。

注意

Atlas样本数据集

此示例使用Atlas示例数据集中的 sample_mflix.movies集合。要学习;了解如何设立免费套餐的Atlas 集群并加载示例数据集,请参阅Atlas文档中的Atlas入门教程

在运行此示例之前,您必须在 movies集合上创建一个具有以下定义的Atlas Search索引:

{
"mappings": {
"dynamic": true,
"fields": {
"title": {
"analyzer": "lucene.keyword",
"type": "string"
},
"genres": {
"normalizer": "lowercase",
"type": "token"
}
}
}
}

要学习;了解有关创建Atlas Search索引的更多信息,请参阅 Atlas Search和 Vector Search 索引指南。

以下代码创建具有以下规范的 $search 阶段:

  • 检查 genres大量是否包含 "Comedy"

  • fullplot 字段中搜索字段"new york"

  • 匹配介于 19502000(含)之间的 year

  • 搜索以术语"Love" 开头的 title

val searchStage = Aggregates.search(
SearchOperator.compound()
.filter(
listOf(
SearchOperator.`in`(fieldPath("genres"), listOf("Comedy")),
SearchOperator.phrase(fieldPath("fullplot"), "new york"),
SearchOperator.numberRange(fieldPath("year")).gtLt(1950, 2000),
SearchOperator.wildcard(fieldPath("title"), "Love *")
)
)
)
val projectStage = Aggregates.project(
Projections.include("title", "year", "genres"))
val pipeline = listOf(searchStage, projectStage)
val results = collection.aggregate(pipeline)
results.forEach { result -> println(result) }
Document{{_id=..., genres=[Comedy, Romance], title=Love at First Bite, year=1979}}
Document{{_id=..., genres=[Comedy, Drama], title=Love Affair, year=1994}}

要学习;了解有关Atlas Search助手方法的更多信息,请参阅驱动程序核心API文档中的 SearchOperator 接口参考。

要查看表达式操作符的完整列表,请参阅MongoDB Server手册中的聚合操作符

要学习;了解如何组装聚合管道并查看示例,请参阅MongoDB Server手册中的聚合管道

要学习;了解有关创建管道阶段的更多信息,请参阅MongoDB Server手册中的聚合阶段

要学习;了解有关解释MongoDB操作的更多信息,请参阅MongoDB Server手册中的解释输出查询计划

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

后退

Atlas Search和 Vector Search

在此页面上