cursor.noCursorTimeout()
定义
cursor.noCursorTimeout()
重要
mongosh 方法
本页面提供
mongosh
方法的相关信息。这不是特定于语言的驱动程序(例如 Node.js)的文档。如需了解 MongoDB API 驱动程序,请参阅特定语言的 MongoDB 驱动程序文档。
指示服务器避免在一段时间不活动后自动关闭游标。
noCursorTimeout()
方法具有以下原型形式:db.collection.find(<query>).noCursorTimeout()
兼容性
此方法可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
M 0 、M 2和 M 5集群不支持此命令。 有关更多信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
行为
会话空闲超时重写 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()
,但它仍会终止游标。当应用程序请求下一批文档时,服务器会返回错误。
刷新游标 refreshSessions
对于返回游标的操作,如果游标的空闲时间可能超过 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 驱动程序,请参阅驱动程序文档,了解创建会话的说明和语法。