Definición
cursor.noCursorTimeout()Importante
Método mongosh
Esta página documenta a
mongoshMétodo. Esta no es la documentación de un controlador específico del lenguaje, como Node.js.Para los drivers de API de MongoDB, consulte la documentación del driver de MongoDB específica del lenguaje.
Instruye al servidor para que evite cerrar automáticamente un cursor después de un período de inactividad.
El método tiene la siguiente forma de
noCursorTimeout()prototipo:db.collection.find(<query>).noCursorTimeout()
Compatibilidad
Este método está disponible en implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Importante
Este comando no es compatible con los clústeres M0 y Flex. Para obtener más información, consulta Comandos no compatibles.
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Comportamiento
Modificaciones al tiempo de espera por inactividad noCursorTimeout
Los drivers de MongoDB y mongosh asocian todas las operaciones con una sesión de servidor, con la excepción de las operaciones de escritura no reconocidas. Para las operaciones no asociadas explícitamente a una sesión (es decir, mediante Mongo.startSession()), los drivers de MongoDB y mongosh crean una sesión implícita y la asocian con la operación.
Si una sesión permanece inactiva durante más de 30 minutos, el servidor de MongoDB marca esa sesión como caducada y puede cerrarla en cualquier momento. Cuando el servidor de MongoDB cierra la sesión, también finaliza todas las operaciones en curso y los cursores abiertos asociados con la sesión. Esto incluye cursores configurados con noCursorTimeout() o un maxTimeMS() mayor que 30 minutos.
Considera una aplicación que emite un db.collection.find() con cursor.noCursorTimeout(). El servidor devuelve un cursor junto con un lote de documentos definido por el cursor.batchSize() de la find(). La sesión se actualiza cada vez que la aplicación solicita un nuevo lote de documentos del servidor. Sin embargo, si la aplicación tarda más de 30 minutos en procesar el lote actual de documentos, la sesión se marca como caducada y se cierra. Cuando el servidor cierra la sesión, también mata el cursor a pesar de que el cursor esté configurado con noCursorTimeout(). Cuando la aplicación solicita el siguiente lote de documentos, el servidor devuelve un error.
Actualizar un cursor con refreshSessions
Para las operaciones que devuelven un cursor, si el cursor puede estar inactivo durante más de 30 minutos, emite la operación dentro de una sesión explícita utilizando Mongo.startSession() y actualiza periódicamente la sesión utilizando el comando refreshSessions. Por ejemplo:
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 }
En la operación de ejemplo, el método db.collection.find() está asociado con una sesión explícita. El cursor está configurado con cursor.noCursorTimeout() para evitar que el servidor cierre el cursor si permanece inactivo. El bucle while incluye un bloque que utiliza refreshSessions para refrescar la sesión cada 5 minutos. Dado que la sesión nunca excederá el tiempo de espera de inactividad de 30 minutos, el cursor puede permanecer abierto indefinidamente.
Para los controladores de MongoDB, consulta la documentación del controlador para obtener instrucciones y la sintaxis para crear sesiones.