A Elcursor es un puntero a los resultados de una consulta. Los cursores permiten iterar sobre los resultados de la base de datos, lote por lote.
Casos de uso
Cuando ejecutas find() Los métodos mongosh y aggregate() o un controlador devuelven un cursor con un lote de resultados. Puede acceder a los documentos resultantes iterando manualmente el cursor o usando el método. Para más información,toArray() consulte Iterar un cursor mongosh en.
Si se está accediendo a una colección con tamaño fijo, se puede utilizar un cursor con seguimiento que recupere los nuevos documentos a medida que se insertan en la colección. Para aprender más, se puede consultar Cursores con seguimiento.
Comportamiento
Los cursores creados dentro de una sesión de cliente se cierran en los siguientes escenarios:
El cliente agota el cursor.
Un usuario cierra manualmente el cursor.
Un usuario termina manualmente la sesión.
La sesión expira.
El parámetro cursorTimeoutMillis especifica el tiempo de espera para los cursores inactivos y tiene un valor por defecto de 10 minutos. MongoDB cierra los cursores inactivos creados fuera de las sesiones después de este umbral de tiempo. MongoDB extiende el tiempo de espera del cursor cada vez que el cursor devuelve una nueva agrupación. Para cerrar un cursor manualmente, se puede utilizar killCursors.
El tiempo de espera de la sesión del servidor se especifica mediante el parámetro localLogicalSessionTimeoutMinutes y tiene un valor por defecto de 30 minutos. Para extender una sesión más allá de 30 minutos, utilice refreshSessions. Para terminar manualmente una sesión, utilice killSessions.
Si se abre un cursor fuera de una sesión, los controladores de MongoDB y mongosh crean una sesión implícita y la asocian con la operación.
Actualizaciones concurrentes mientras se utiliza un cursor
A medida que un cursor devuelve documentos, otras operaciones pueden ejecutarse en segundo plano y afectar los resultados, dependiendo del nivel de consistencia de lectura. Para más detalles, consulte Aislamiento de lectura, coherencia y actualidad.
Empezar
Detalles
Cuando se ejecuta una operación find o aggregate, la base de datos ejecuta un query hasta que encuentra suficientes documentos para llenar una agrupación. Cuando se llena una agrupación, el query se pausa. El query pausado en el servidor se denomina cursor y el ID asociado con el query pausado es un ID de cursor.
La base de datos devuelve la agrupación resultante y el ID del cursor al cliente. Los drivers de MongoDB y mongosh almacenan estos datos en una instancia de cursor del lado del cliente. Si hay más documentos coincidentes al llegar al final de una agrupación, el cursor del lado del cliente recupera automáticamente la siguiente agrupación del servidor usando getMore. Para ver cuántos resultados quedan en la agrupación actual, se usa cursor.objsLeftInBatch(). Para comprobar si quedan resultados en la agrupación actual o en el servidor, se usa cursor.hasNext().
Agrupaciones de cursores
Los cursores devuelven resultados en agrupaciones. La cantidad de datos en una agrupación debe ser menor que el tamaño máximo del documento BSON (16 MiB). Para especificar el número máximo de documentos permitidos en un lote, se puede consultar cursor.batchSize(). Por defecto, el tamaño de la agrupación para las operaciones de find() y aggregate() es 101. Las operaciones getMore subsiguientes emitidas contra el cursor resultante no tienen un tamaño de agrupación por defecto, por lo que están limitadas solo por el tamaño de mensaje de 16 mebibytes.
Clasificación
Para los queries que incluyen una operación de ordenación sin un índice, el servidor debe cargar todos los documentos en memoria para realizar la ordenación antes de devolver cualquier resultado.
Información del cursor
El método db.serverStatus() devuelve un documento que incluye un campo metrics. El campo metrics incluye un campo metrics.cursor con información detallada sobre el cursor. Para aprender más, se puede consultar metrics.cursor.