定义
cursor.noCursorTimeout()重要
mongosh 方法
本页介绍了
mongosh方法。这不是特定于语言的驾驶员(例如 Node.js)的文档。如需了解 MongoDB API 驱动程序,请参阅特定语言的 MongoDB 驱动程序文档。
指示服务器避免在一段时间不活动后自动关闭游标。
noCursorTimeout()方法具有以下原型形式:db.collection.find(<query>).noCursorTimeout()
兼容性
此方法可用于以下环境中托管的部署:
- MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
M0 和 Flex 集群不支持此命令。有关更多信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
行为
会话空闲超时重写 noCursorTimeout
MongoDB驱动程序和mongosh 将所有操作与服务器会话关联,但未确认的写入操作除外。对于未显式与会话关联的操作(即使用 ),Mongo.startSession() MongoDB驱动程序和mongosh 会创建一个隐式会话并将其与操作关联。
如果会话空闲时间超过30 分钟, MongoDB 服务器会将该会话标记为已过期,并可能随时将其关闭。当MongoDB服务器关闭会话时,它还会终止任何正在进行的操作并打开与会话关联的游标。这包括配置有超过noCursorTimeout() maxTimeMS()30分钟的 或 的游标。
考虑一个使用 发出db.collection.find() cursor.noCursorTimeout()的应用程序。服务器返回一个游标以及批处理由cursor.batchSize() 或find() 定义的文档。每次应用程序从服务器请求批处理新文档时,会话都会刷新。但是,如果应用程序进程当前批处理文档的时间超过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 refreshSessions5循环包含一个区块,该区块使用 每 分钟刷新一次会话。由于会话永远不会超过30 分钟空闲超时,因此游标可以无限期地保持打开状态。
对于 MongoDB 驱动程序,请参阅驱动程序文档,了解创建会话的说明和语法。