Docs 主页 → 开发应用程序 → MongoDB Manual
cursor.maxTimeMS()
定义
cursor.maxTimeMS(<time limit>)
重要
mongosh 方法
本页介绍了
mongosh
方法。这不是特定于语言的驱动程序(例如 Node.js)的文档。对于 MongoDB API 驱动程序,请参阅特定语言的MongoDB 驱动程序文档。
指定在游标上处理操作的累计时间限制(以毫秒为单位)。
maxTimeMS()
方法具有以下原型形式:db.collection.find( { <query> }, { <projection> } ).maxTimeMS( <milliseconds> ) maxTimeMS()
方法具有以下参数:范围类型说明milliseconds
整型指定在游标上处理操作的累计时间限制(以毫秒为单位)。
重要
maxTimeMS()
与NoCursorTimeout
查询标志无关。 maxTimeMS()
与处理时间有关,而NoCursorTimeout
与空闲时间有关。游标的空闲时间不会计入其处理时间。
maxAwaitTimeMS()
方法对可追加游标等待下一个响应的时间设置了限制。它不对总处理时间设置限制。
行为
如果关联的游标超过其分配的时间限制,则 MongoDB 将终止操作。MongoDB 使用与 db.killOp()
相同的机制终止超过分配时间限制的操作。MongoDB 仅在其指定的中断点之一终止操作。
MongoDB 不会将客户端和服务器之间的网络延迟计入游标的时间限制。然而,对于分片集群,MongoDB 会将 mongos
和 mongod
实例之间的延迟计入此时间限制中。
生成多批结果的查询会继续返回多批结果,直到游标超出其分配的时间限制。
会话空闲超时重写 maxTimeMS
MongoDB 驱动程序和mongosh
将所有操作与服务器会话关联,但未确认的写入操作除外。对于未显式与会话关联的操作(即使用Mongo.startSession()
),MongoDB 驱动程序和mongosh
创建隐式会话并将其与操作关联。
如果会话空闲时间超过30分钟,MongoDB Server 会将该会话标记为已过期,并可能随时将其关闭。当 MongoDB 服务器关闭会话时,它还会终止任何正在进行的操作并打开与会话关联的游标。这包括配置有noCursorTimeout()
或大于30分钟的maxTimeMS()
的游标。
例如,考虑一个find()
maxTimeMS()
31操作,其中 配置为cursor.batchSize()
分钟的超时。服务器返回一个游标以及一批由 的find()
定义的文档。每次应用程序从服务器请求一批新文档时,会话都会刷新。但是,如果应用程序处理当前批次文档的时间超过30 分钟,则会话将被标记为已过期并关闭。当服务器关闭会话时,它也会终止游标, 尽管 maxTimeMS()
将游标配置为大于30 分钟的 。当应用程序请求下一批文档时,服务器会返回错误。
对于返回游标的操作,如果游标的空闲时间可能超过 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.maxTimeMS()
,以使游标保持打开状态至少31分钟。 while
循环包含一个区块,该区块使用refreshSessions
每5分钟刷新一次会话。由于会话永远不会超过30分钟的空闲超时,因此游标可以在配置的maxTimeMS()
之前保持打开状态。
对于 MongoDB 驱动程序,请参阅驱动程序文档以获取创建会话的说明和语法。
提示
另请参阅:
举例
例子
以下查询指定了 50 毫秒的时间限制:
db.collection.find({description: /August [0-9]+, 1969/}).maxTimeMS(50)