“文档” 菜单
文档首页
/
MongoDB Manual
/ / /

cursor.noCursorTimeout()

在此页面上

  • 定义
  • 行为
cursor.noCursorTimeout()

重要

mongosh 方法

本页面提供 mongosh 方法的相关信息。这不是特定于语言的驱动程序(例如 Node.js)的文档。

如需了解 MongoDB API 驱动程序,请参阅特定语言的 MongoDB 驱动程序文档。

指示服务器避免在一段时间不活动后自动关闭游标。

noCursorTimeout() 方法具有以下原型形式:

db.collection.find(<query>).noCursorTimeout()

MongoDB 驱动程序和mongosh将所有操作与服务器会话关联,但未确认的写入操作除外。对于未显式与会话关联的操作(即使用Mongo.startSession() ),MongoDB 驱动程序和mongosh创建隐式会话并将其与操作关联。

如果会话空闲时间超过 30 分钟,MongoDB Server 则会将此会话标记为已过期,并可能随时将其关闭。当 MongoDB Server 关闭会话时,它还会终止任何正在进行的操作并打开与会话关联的游标。其中包括使用 noCursorTimeout() 或大于 30 分钟的 maxTimeMS() 配置的游标。

考虑一个使用 cursor.noCursorTimeout() 发出 db.collection.find() 的应用程序。服务器会返回一个游标以及由 find()cursor.batchSize() 所定义的一批文档。每次应用程序从服务器请求一批新文档时,此会话均会刷新。但是,如果应用程序处理当前批次文档的时间超过 30 分钟,会话就会被标记为过期并关闭。当服务器关闭此会话时,尽管游标配置为 noCursorTimeout(),但它仍会终止游标。当应用程序请求下一批文档时,服务器会返回错误。

对于返回游标的操作,如果游标的空闲时间可能超过 30 分钟,则使用 Mongo.startSession() 在显式会话中发出操作,并使用 refreshSessions 命令定期刷新会话。例如:

var session = db.getMongo().startSession()
var sessionId = session
sessionId // show the sessionId
var cursor = session.getDatabase("examples").getCollection("data").find().noCursorTimeout()
var refreshTimestamp = new Date() // take note of time at operation start
while (cursor.hasNext()) {
// Check if more than 5 minutes have passed since the last refresh
if ( (new Date()-refreshTimestamp)/1000 > 300 ) {
print("refreshing session")
db.adminCommand({"refreshSessions" : [sessionId]})
refreshTimestamp = new Date()
}
// process cursor normally
}

在示例操作中,db.collection.find() 方法与显式会话相关联。为游标配置 cursor.noCursorTimeout(),以防止服务器在空闲时关闭游标。while 循环包含一个块,而该块使用 refreshSessions 每 5 分钟刷新一次会话。由于此会话永不会超过 30 分钟的空闲超时时间,因此游标可无限期地保持打开状态。

对于 MongoDB 驱动程序,请参阅驱动程序文档以获取创建会话的说明和语法。

← cursor.next()

在此页面上