Docs 菜单
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() 方法具有以下参数:

Parameter
类型
说明

milliseconds

整型

指定在游标上处理操作的累计时间限制(以毫秒为单位)。

重要

maxTimeMS()NoCursorTimeout 查询标记无关。maxTimeMS() 与处理时间有关,而 NoCursorTimeout 与空闲时间有关。游标的空闲时间不会计入其处理时间。

maxAwaitTimeMS() 方法对可追加游标等待下一个响应的时间设置了限制。它不对总处理时间设置限制。

此方法可用于以下环境中托管的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

注意

所有 MongoDB Atlas 集群都支持此命令。有关 Atlas 对所有命令的支持的信息,请参阅不支持的命令

如果关联的游标超过其分配的时间限制,则 MongoDB 将终止操作。MongoDB 使用与 db.killOp() 相同的机制终止超过分配时间限制的操作。MongoDB 仅在其指定的中断点之一终止操作。

MongoDB 不会将客户端和服务器之间的网络延迟计入游标的时间限制。然而,对于分片集群,MongoDB 会将 mongosmongod 实例之间的延迟计入此时间限制中。

生成多批结果的查询会继续返回多批结果,直到游标超出其分配的时间限制。

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

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

例如,考虑一个 find() 操作,其中 maxTimeMS() 的超时时间被配置为 31 分钟。服务器会返回一个游标以及由 find()cursor.batchSize() 所定义的一批文档。每次应用程序从服务器请求一批新文档时,此会话均会刷新。但是,如果应用程序处理当前批次文档的时间超过 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 驱动程序,请参阅驱动程序文档,了解创建会话的说明和语法。

提示

另请参阅:

从 MongoDB 8.0 开始,可以使用 defaultMaxTimeMS 集群参数为要完成的个别读取操作指定默认时间限制。如果查询指定了 maxTimeMS() 选项,则该值将覆盖 defaultMaxTimeMS 值。

例子

以下查询指定了 50 毫秒的时间限制:

db.collection.find({description: /August [0-9]+, 1969/}).maxTimeMS(50)

后退

游标.maxAwaitTimeMS