对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

游标()(mongosh方法)

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 会将 mongos 和 mongod 实例之间的延迟计入此时间限制中。

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

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

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

示例,考虑一个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 驱动程序,请参阅驱动程序文档,了解创建会话的说明和语法。

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

例子

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

db.collection.find({description: /August [0-9]+, 1969/}).maxTimeMS(50)
给本页内容打分