文档菜单
文档首页
/ / /
Kotlin 协程

从 Flow 中访问数据

本页内容

  • 概述
  • 终端方法
  • 查找第一个文档
  • 计数结果数量
  • 将结果转换为列表
  • 遍历结果
  • 解释查询

在本指南中,您可以了解如何使用 MongoDB Kotlin 驱动程序通过Flow 访问数据。

Flow 是 Kotlin 协程内置的一种数据类型,表示正在异步计算的一串值。Kotlin 协程驱动程序使用 flows 来表示数据库读取操作的结果。

本页使用启动方法 find() 来展示如何访问FindFlow.

注意

以下访问和存储数据的方法也适用于其他可迭代对象,例如 AggregateFlow。

find() 方法创建并返回一个 FindFlow 实例。一个 FindFlow 允许您浏览符合搜索条件的文档,并通过设置方法参数来进一步指定要查看哪些文档。

终端方法在配置了控制操作的 Flow 实例的所有参数后,在 MongoDB 服务器上执行操作。

使用 firstOrNull() 方法检索查询结果中的第一个文档,如果没有结果则返回 null

val resultsFlow = collection.find()
val firstResultOrNull = resultsFlow.firstOrNull()

或者,您可以使用 first() 方法检索查询的第一个文档,如果没有结果则抛出 NoSuchElementException

try {
val resultsFlow = collection.find()
val firstResult = resultsFlow.first()
} catch (e: NoSuchElementException) {
println("No results found")
}

当您的查询过滤器将匹配一个文档时,通常使用这些方法,例如根据唯一索引进行过滤。

使用 count() 方法检索查询中的结果数量。

val resultsFlow = collection.find()
val count = resultsFlow.count()

使用 toList() 方法将查询结果存储在 List

val resultsFlow = collection.find()
val results = resultsFlow.toList()

此方法通常在查询过滤器返回少量文档且可以适应可用内存时使用。

使用 collect() 方法遍历获取的文档,并确保在提前终止时关闭流

val resultsFlow = collection.find()
resultsFlow.collect { println(it) }

使用 explain() 方法查看MongoDB执行操作的信息。

explain() 方法返回 执行计划 和性能统计信息。执行计划是MongoDB完成操作的可能方式。该 explain() 方法提供了获胜计划(MongoDB执行的计划)和拒绝的计划。

您可以通过传递一个详细程度级别到 explain() 方法来指定解释的详细程度。

以下表格显示了所有详细程度级别及其预期用途

详细程度级别
用途
ALL_PLANS_EXECUTIONS
您想了解MongoDB将选择哪个计划来运行查询。
EXECUTION_STATS
您想了解查询是否运行良好。
QUERY_PLANNER
您的查询存在问题,您希望获取尽可能多的信息以诊断问题。

以下示例打印出聚合阶段产生执行计划的获胜计划的JSON表示形式

val explanation = collection.find().explain(ExplainVerbosity.EXECUTION_STATS)
val jsonSummary = explanation.getEmbedded(
listOf("queryPlanner", "winningPlan"),
Document::class.java
).toJson()
println(jsonSummary)
{ "stage": "COLLSCAN", "direction": "forward" }

有关解释操作的更多信息,请参阅以下服务器手册条目

  • 解释输出

  • 查询计划

有关本节中提到的方法和类的更多信息,请参阅以下API文档

下一页

MongoDB Kotlin 驱动