Database Manual / Reference / mongosh Methods / Cursors

cursor.maxTimeMS() (mongosh method方法)

Definition定义

cursor.maxTimeMS(<time limit>)

Important

mongosh Method方法

This page documents a mongosh method. This is not the documentation for a language-specific driver, such as Node.js.本页记录了一种mongosh方法。这不是针对特定语言驱动程序(如Node.js)的文档。

For MongoDB API drivers, refer to the language-specific MongoDB driver documentation.有关MongoDB API驱动程序,请参阅特定语言的MongoDB驱动程序文档

Specifies a cumulative time limit in milliseconds for processing operations on a cursor.指定游标上处理操作的累积时间限制(以毫秒为单位)。

The maxTimeMS() method has the following prototype form:maxTimeMS()方法具有以下原型形式:

db.collection.find(
{ <query> },
{ <projection> }
).maxTimeMS( <milliseconds> )

The maxTimeMS() method has the following parameter:maxTimeMS()方法有以下参数:

Parameter参数Type类型Description描述
millisecondsinteger整数Specifies a cumulative time limit in milliseconds for processing operations on the cursor.指定游标上处理操作的累积时间限制(以毫秒为单位)。

Important

maxTimeMS() is not related to the NoCursorTimeout query flag. NoCursorTimeout查询标志无关。maxTimeMS() relates to processing time, while NoCursorTimeout relates to idle time. 与处理时间有关,而NoCursorTimeout与空闲时间有关。A cursor's idle time does not contribute towards its processing time.游标的空闲时间不会影响其处理时间。

The maxAwaitTimeMS() method sets a limit on how long a tailable cursor waits for the next response. maxAwaitTimeMS()方法设置了可尾随游标等待下一个响应的时间限制。It does not set a limit on total processing time.它没有对总处理时间设置限制。

Compatibility兼容性

This method is available in deployments hosted in the following environments:此方法在以下环境中托管的部署中可用:

  • MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud:云中MongoDB部署的完全托管服务

Note

This command is supported in all MongoDB Atlas clusters. 所有MongoDB Atlas集群都支持此命令。For information on Atlas support for all commands, see Unsupported Commands.有关Atlas支持所有命令的信息,请参阅不支持的命令

  • MongoDB Enterprise: The subscription-based, self-managed version of MongoDB:MongoDB的基于订阅的自我管理版本
  • MongoDB Community: The source-available, free-to-use, and self-managed version of MongoDB:MongoDB的源代码可用、免费使用和自我管理版本

Behaviors行为

MongoDB targets operations for termination if the associated cursor exceeds its allotted time limit. MongoDB terminates operations that exceed their allotted time limit using the same mechanism as db.killOp(). 如果关联的游标超过其分配的时间限制,MongoDB将终止操作。MongoDB使用与db.killOp()相同的机制终止超过分配时间限制的操作。MongoDB only terminates an operation at one of its designated interrupt points.MongoDB仅在其指定的中断点之一终止操作。

MongoDB does not count network latency between the client and the server towards a cursor's time limit. MongoDB不会将客户端和服务器之间的网络延迟计入游标的时间限制。For a sharded cluster, however, MongoDB does include the latency between the mongos and mongod instances towards this time limit.然而,对于分片集群,MongoDB确实考虑了mongosmongod实例之间的延迟。

Queries that generate multiple batches of results continue to return batches until the cursor exceeds its allotted time limit.生成多批结果的查询将继续返回批,直到游标超过其分配的时间限制。

Session Idle Timeout Overrides maxTimeMS会话空闲超时覆盖maxTimeMS

MongoDB drivers and mongosh associate all operations with a server session, with the exception of unacknowledged write operations. MongoDB驱动程序和mongosh将所有操作与服务器会话相关联,但未确认的写入操作除外。For operations not explicitly associated with a session (i.e. using Mongo.startSession()), MongoDB drivers and mongosh create an implicit session and associate it with the operation.对于未明确与会话关联的操作(即使用Mongo.startSession()),MongoDB驱动程序和mongosh会创建一个隐式会话并将其与操作关联。

If a session is idle for longer than 30 minutes, the MongoDB server marks that session as expired and may close it at any time. When the MongoDB server closes the session, it also kills any in-progress operations and open cursors associated with the session. 如果会话空闲时间超过30分钟,MongoDB服务器会将该会话标记为已过期,并可能随时将其关闭。当MongoDB服务器关闭会话时,它还会终止任何正在进行的操作并打开与会话关联的游标。This includes cursors configured with noCursorTimeout() or a maxTimeMS() greater than 30 minutes.这包括配置了noCursorTimeout()或大于30分钟的maxTimeMS()的游标。

For example, consider a find() operation with the maxTimeMS() configured for a timeout of 31 minutes. 例如,考虑一个find()操作,其中maxTimeMS()配置为超时31分钟。The server returns a cursor along with a batch of documents defined by the cursor.batchSize() of the find(). 服务器返回一个游标以及由find()cursor.batchSize()定义的一批文档。The session refreshes each time the application requests a new batch of documents from the server. However, if the application takes longer than 30 minutes to process the current batch of documents, the session is marked as expired and closed. 每次应用程序向服务器请求一批新文档时,会话都会刷新。但是,如果应用程序处理当前一批文档的时间超过30分钟,则会话将标记为已过期并关闭。When the server closes the session, it also kills the cursor despite the cursor being configured with maxTimeMS() greater than 30 minutes. 当服务器关闭会话时,它也会杀死游标,尽管游标配置的maxTimeMS()大于30分钟。When the application requests the next batch of documents, the server returns an error.当应用程序请求下一批文档时,服务器返回错误。

For operations that return a cursor, if the cursor may be idle for longer than 30 minutes, issue the operation within an explicit session using Mongo.startSession() and periodically refresh the session using the refreshSessions command. For example:对于返回游标的操作,如果游标可能空闲超过30分钟,请使用Mongo.startSession()在显式会话中发出该操作,并使用refreshSessions命令定期刷新会话。例如:

var session = db.getMongo().startSession()
var sessionId = session
sessionId // show the sessionId显示会话ID

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检查自上次刷新以来是否已过去5分钟以上
if ( (new Date()-refreshTimestamp)/1000 > 300 ) {
print("refreshing session")
db.adminCommand({"refreshSessions" : [sessionId]})
refreshTimestamp = new Date()
}

// process cursor normally正常处理游标

}

In the example operation, the db.collection.find() method is associated with an explicit session. The cursor is configured with cursor.maxTimeMS() to keep the cursor open for at least 31 minutes. 在示例操作中,db.collection.find()方法与显式会话相关联。游标配置了cursor.maxTimeMS(),以保持游标打开至少31分钟。The while loop includes a block that uses refreshSessions to refresh the session every 5 minutes. while循环包含一个块,该块使用refreshSessions每5分钟刷新一次会话。Since the session will never exceed the 30 minute idle timeout, the cursor can remain open up to the configured maxTimeMS().由于会话永远不会超过30分钟的空闲超时,游标可以保持打开状态,直到配置的maxTimeMS()

For MongoDB drivers, defer to the driver documentation for instructions and syntax for creating sessions.对于MongoDB驱动程序,请参阅驱动程序文档以获取创建会话的说明和语法。

Default Timeout for All Operations所有操作的默认超时

Starting in MongoDB 8.0, you can use the defaultMaxTimeMS cluster parameter to specify a default time limit for individual read operations to complete. 从MongoDB 8.0开始,您可以使用defaultMaxTimeMS集群参数为完成单个读取操作指定默认时间限制。If a query specifies a maxTimeMS() option, that value overrides the defaultMaxTimeMS value.如果查询指定了maxTimeMS()选项,则该值将覆盖默认的maxTimeMS值。

Examples示例

Example示例

The following query specifies a time limit of 50 milliseconds:以下查询指定了50毫秒的时间限制:

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