从 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文档