Definição
cursor.noCursorTimeout()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 do MongoDB específica da linguagem.
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()
Compatibilidade
Esse método está disponível em implantações hospedadas nos seguintes ambientes:
- MongoDB Atlas: o serviço totalmente gerenciado para implantações MongoDB na nuvem
Importante
Este comando não é suportado em clusters M0 e Flex. Para obter mais informações, consulte Comandos não suportados.
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Comportamento
Substituições de tempo limite de inatividade da sessão noCursorTimeout
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 de 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 maxTimeMS() maior que 30 minutos.
Considere um aplicação que emite um db.collection.find() com cursor.noCursorTimeout(). 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 aplicação 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 do cursor sendo configurado com noCursorTimeout(). Quando o aplicação solicita o próximo lote de documentos, o servidor retorna um erro.
Atualizar um cursor com refreshSessions
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 se estiver ocioso. 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 de 30 minutos, o cursor pode permanecer aberto indefinidamente.
Para drivers MongoDB , consulte a documentação do driver para obter instruções e sintaxe para criar sessões.