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

从游标访问数据

在此页面上

  • Overview
  • 以迭代方式访问游标内容
  • 分别检索文档
  • 检索所有文档
  • 可追加游标
  • 故障排除
  • API 文档

在本指南中,您可以学习;了解如何使用Kotlin Sync驾驶员从游标访问权限数据。

游标是一种以可迭代批处理方式返回读取操作结果的机制。 由于游标在任何给定时间仅保存文档的子集,因此游标可减少内存消耗和驾驶员发送到服务器的请求数量。

每当Kotlin Sync驾驶员执行返回多个文档的读取操作时,它都会自动在游标中返回这些文档。

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

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

data class Restaurant(
@BsonId
val id: ObjectId,
val name: String
)

要遍历游标的内容,请使用forEach()方法,如以下示例所示:

val results = collection.find()
results.forEach { result ->
println(result)
}

或者,使用use()方法在游标上实现循环:

val results = collection.find()
results.cursor().use { cursor ->
while (cursor.hasNext()) {
println(resultCursor.next())
}
}

注意

默认,当客户端用完游标中的所有结果时, MongoDB会关闭游标。 本指南中的示例使用close()方法显式关闭游标。

通过调用next()方法从游标单独检索文档。

以下示例查找集合中name值为"Dunkin' Donuts"的所有文档。 然后,它通过调用next()方法来打印游标中的第一个文档。

val results = collection
.find<Restaurant>(eq(Restaurant::name.name, "Dunkin' Donuts"))
results.cursor().use { cursor ->
println(if (cursor.hasNext()) cursor.next()
else "No document matches the filter")
}
Restaurant(id=5eb3d668b31de5d588f42c66, name=Dunkin' Donuts)

警告

如果查询返回的文档数量和大小超过可用的应用程序内存,程序就会崩溃。 如果需要大型结果集,请以迭代方式访问游标。

要从游标检索所有文档,请将游标转换为List ,如以下示例所示:

val results = collection.find<Restaurant>(eq(Restaurant::name.name, "Dunkin' Donuts"))
val resultsList = results.toList()
for (result in resultsList) {
println(result)
}
Restaurant(id=5eb3d668b31de5d588f42c66, name=Dunkin' Donuts)
Restaurant(id=5eb3d668b31de5d588f42ca0, name=Dunkin' Donuts)
Restaurant(id=5eb3d668b31de5d588f42b08, name=Dunkin' Donuts)
Restaurant(id=5eb3d668b31de5d588f42cd7, name=Dunkin' Donuts)
...

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

以下示例在固定大小固定大小集合上创建可可追加游标:

val results = collection.find<Document>().cursorType(CursorType.TailableAwait)

要学习;了解有关可追加游标及其用法的更多信息,请参阅MongoDB Server手册中的可追加游标指南

MongoDB 中的游标如果长时间打开且未对其执行任何操作,则可能会在服务器上超时。 当您尝试遍历游标时,这可能会导致CursorNotFound异常。

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档:

后退

检索不同字段值