Definición
cursor.maxTimeMS(<time limit>)Importante
Método mongosh
Esta página documenta un método
mongosh. Esta no es la documentación para un driver específico de lenguaje, como Node.js.Para los drivers de API de MongoDB, consulte la documentación del driver de MongoDB específica del lenguaje.
Especifica un límite de tiempo acumulativo en milisegundos para las operaciones de procesamiento en un cursor.
El método
maxTimeMS()tiene la siguiente forma de prototipo:db.collection.find( { <query> }, { <projection> } ).maxTimeMS( <milliseconds> ) El método
maxTimeMS()tiene el siguiente parámetro:ParameterTipoDescripciónmillisecondsentero
Especifica un límite de tiempo acumulado en milisegundos para las operaciones de procesamiento en el cursor.
Importante
maxTimeMS() no está relacionado con el indicador de query NoCursorTimeout. maxTimeMS() se refiere al tiempo de procesamiento, mientras que NoCursorTimeout se refiere al tiempo de inactividad. El tiempo inactivo de un cursor no se suma a su tiempo de procesamiento.
La maxAwaitTimeMS() El método establece un límite sobre cuánto tiempo un cursor con seguimiento espera la siguiente respuesta. No establece un límite para el tiempo total de procesamiento.
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
Nota
Este comando es compatible con todos los clústeres de MongoDB Atlas. Para obtener información sobre el soporte de Atlas para todos los comandos, consulte 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.
Comportamientos
MongoDB apunta a operaciones para terminación si el cursor asociado excede su límite de tiempo asignado. MongoDB termina las operaciones que exceden su límite de tiempo asignado utilizando el mismo mecanismo que db.killOp(). MongoDB solo termina una operación en uno de sus puntos designados de interrupción.
MongoDB no cuenta la latencia de red entre el cliente y el servidor en el límite de tiempo de un cursor. En el caso de un clúster fragmentado, MongoDB sí incluye la latencia entre las instancias mongos y mongod dentro de este límite de tiempo.
Las consultas que generan múltiples lotes de resultados seguirán devolviendo lotes hasta que el cursor supere su tiempo asignado.
Modificaciones al tiempo de espera por inactividad maxTimeMS
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 por más de 30 minutos, el servidor de MongoDB marca esa sesión como expirada y puede cerrarla en cualquier momento. Cuando el servidor MongoDB cierra la sesión, también termina cualquier operación en curso y cursores abiertos asociados con la sesión. Esto incluye cursores configurados con noCursorTimeout() o un maxTimeMS() mayor a 30 minutos.
Por ejemplo, considera una find() operación con maxTimeMS() configurado para un tiempo de espera de 31 minutos. El servidor devuelve un cursor junto con un lote de documentos definidos por el cursor.batchSize() del find(). La sesión se actualiza cada vez que la aplicación solicita un nuevo conjunto de documentos al 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 expirada y se cierra. Cuando el servidor cierra la sesión, también elimina el cursor a pesar de que el cursor haya sido configurado con maxTimeMS() mayor a 30 minutos. Cuando la aplicación solicita el siguiente lote de documentos, el servidor devuelve un error.
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 el ejemplo de operación, el método db.collection.find() está asociado a una sesión explícita. El cursor está configurado con cursor.maxTimeMS() para mantener el cursor abierto durante al menos 31 minutos. El bucle while incluye un bloque que utiliza refreshSessions para renovar 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 hasta lo configurado en maxTimeMS().
Para los controladores de MongoDB, consulta la documentación del controlador para obtener instrucciones y la sintaxis para crear sesiones.
Ejemplos
Ejemplo
La siguiente query especifica un límite de tiempo de 50 milisegundos:
db.collection.find({description: /August [0-9]+, 1969/}).maxTimeMS(50)