Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

cursor.noCursorTimeout()

Nesta página

  • Definição
  • Comportamento
cursor.noCursorTimeout()

Importante

Método mongosh

Este é um método mongosh . Esta não é a documentação de Node.js ou de outros métodos de driver específicos da linguagem de programação.

Na maioria dos casos, os métodos mongosh funcionam da mesma forma que os métodos legado do shell mongo . No entanto, alguns métodos legado não estão disponíveis em mongosh.

Para a documentação do shell legado mongo, consulte a documentação para a release correspondente do MongoDB Server:

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

Instrui o servidor para evitar fechar um cursor automaticamente após um período de inatividade.

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

db.collection.find(<query>).noCursorTimeout()

Os drivers MongoDB e mongosh associam todas as operações a uma sessão do servidor, com exceção das operações de gravação não reconhecidas. No caso das operações não associadas explicitamente a uma sessão (ou seja, usando Mongo.startSession()), os drivers 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 elimina todas as operações em andamento e abre os cursores associados à sessão. Isso inclui cursores configurados com noCursorTimeout() ou maxTimeMS() com mais de 30 minutos.

Considere um aplicativo que emite um db.collection.find() com cursor.noCursorTimeout(). O servidor retorna um cursor 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 o aplicativo 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 ele estar configurado com noCursorTimeout(). 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.noCursorTimeout() para evitar que o servidor feche o cursor por ociosidade. O loop while inclui um bloco que usa refreshSessions para atualizar a sessão a cada 5 minutos. Como a sessão nunca excederá o tempo-limite de inatividade de 30 minutos, o cursor poderá permanecer aberto indefinidamente.

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

Voltar

cursor.next