对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

从流程访问数据

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

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

本页使用启动方法 find() 展示如何从 FindFlow 访问权限数据。

注意

以下访问权限和存储数据的方法应用于其他迭代,例如 AggregateFlow。

find()方法创建并返回FindFlow的实例。 FindFlow 允许您浏览与Atlas Search条件匹配的文档,并通过方法设置参数来进一步指定要查看的文档。

提示

流超时

您可以在流程上设立超时以返回查询结果。要学习;了解更多信息,请参阅《限制服务器执行时间》指南中的游标部分。

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

使用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() 方法来指定说明的详细程度。

下表显示了说明的所有详细级别及其预计使用案例:

详细程度
用例(Use Case)

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" }

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

固定大小集合进行查询时,可以使用可追加游标,该游标在客户端用完游标中的结果后仍保持打开状态。要创建带有固定大小集合的可追加游标,请在 find() 方法的 cursorType 选项中指定 CursorType.TailableAwait

以下示例使用可追加游标来追踪固定大小集合并打印文档。由于 Flow 由保持打开状态的可追加游标支持,因此当将文档添加到集合时,可追加游标会将新结果添加到 Flow

val results = collection.find<Document>().cursorType(CursorType.TailableAwait)
results.collect { document ->
println("Document: $document")
}

要学习;了解有关可追加游标的更多信息,请参阅MongoDB服务器手册中的可追加游标指南

有关本节中提到的方法和类的详情,请参阅以下 API 文档: