Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

cursor.maxTimeMS()

Nesta página

  • Definição
  • Comportamentos
  • Exemplos
cursor.maxTimeMS(<time limit>)

Importante

Método mongosh

Esta página documenta um método mongosh . Esta não é a documentação para um driver específico de idioma, como Node.js.

Para drivers de API do MongoDB, consulte a documentação do driver MongoDB específica do idioma.

Especifica um limite de tempo cumulativo em milissegundos para operações de processamento em um cursor.

O método maxTimeMS() tem a seguinte forma de protótipo:

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

O método maxTimeMS() tem o seguinte parâmetro:

Parâmetro
Tipo
Descrição
milliseconds
inteiro
Especifica um limite de tempo cumulativo em milésimos de segundo para operações de processamento no cursor.

Importante

maxTimeMS() não está relacionado à bandeira de query do NoCursorTimeout . maxTimeMS() diz respeito ao tempo de processamento, enquanto NoCursorTimeout se relaciona com o tempo ocioso. O tempo ocioso de um cursor não contribui para seu tempo de processamento.

O método define um limite maxAwaitTimeMS() para o tempo que um cursor tailable espera pela próxima resposta. Não define um limite no tempo total de processamento.

O MongoDB direciona as operações para encerramento se o cursor associado exceder seu limite de tempo alocado. O MongoDB encerra as operações que excedem o limite de tempo alocado usando o mesmo mecanismo de db.killOp(). O MongoDB só encerra uma operação em um de seus pontos designados.

O MongoDB não conta a latência de rede entre o cliente e o servidor para o limite de tempo de um cursor. Para um cluster fragmentado, no entanto, o MongoDB inclui a latência entre as instâncias mongos e mongod para esse limite de tempo.

As queries que geram vários lotes de resultados continuam a retornar lotes até que o cursor exceda o limite de tempo alocado.

Os drivers e mongosh do MongoDB associam todas as operações a uma sessão de servidor, com exceção de operações de gravação não reconhecidas. Para operações não explicitamente associadas a uma sessão (ou seja, uso Mongo.startSession()), os drivers do MongoDB e mongosh criam uma sessão implícita e a associam à operação.

Se uma sessão estiver ociosa por mais de 30 minutos, o servidor MongoDB marcará essa sessão como expirada e poderá fechá-la a qualquer momento. Quando o servidor MongoDB fecha a sessão, ele também mata quaisquer operações em andamento e abre cursores associados à sessão. Isso inclui cursores configurados com noCursorTimeout() ou um maxTimeMS() maior que 30 minutos.

Por exemplo, considere uma operação do find() com o maxTimeMS() configurado por um tempo limite de 31 minutos. O servidor retorna um cursor junto com um lote de documentos definido pelo cursor.batchSize() do find(). A sessão é atualizada toda vez que o aplicativo solicita um novo lote de documentos do servidor. No entanto, se a aplicação demorar mais de 30 minutos para processar o lote atual de documentos, a sessão será marcada como expirada e encerrada. Quando o servidor fecha a sessão, ele também mata o cursor, apesar de o cursor estar configurado com maxTimeMS() maior que 30 minutos. Quando o aplicativo solicita o próximo lote de documentos, o servidor retorna um erro.

Para operações que retornam um cursor, se o cursor ficar inativo por mais de 30 minutos, execute a operação em uma sessão explícita usando e atualize periodicamente Mongo.startSession() refreshSessions a sessão usando o comando. Por exemplo:

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
}

Na operação de exemplo, o método db.collection.find() está associado com uma sessão explícita. O cursor é configurado com cursor.maxTimeMS() para manter o cursor aberto por pelo menos 31 minutos. O loop while inclui um bloco que utiliza refreshSessions para atualizar a sessão a cada 5 minutos. Como a sessão nunca excederá o tempo-limite de inatividade 30 minutos, o cursor pode permanecer aberto até o maxTimeMS() configurado.

Para drivers MongoDB, consulte a documentação do driver para obter instruções e sintaxe para criar sessões.

Dica

Exemplo

A seguinte query especifica um limite de tempo de 50 milésimos de segundo:

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