El db.collection.find() El método devuelve un cursor. Para acceder a los documentos, es necesario iterarlo. Sin embargo, en, si el cursor devuelto no está asignado a una variable mediante mongosh la var palabra clave, se itera automáticamente hasta 20 veces []1 para imprimir hasta los primeros 20 documentos de los resultados.
Los siguientes ejemplos describen formas de iterar manualmente el cursor para acceder a los documentos o utilizar el índice del iterador.
Iterar manualmente el cursor
mongoshEn, cuando se asigna el cursor devuelto por el método a una variable usando find() la var palabra clave, el cursor no se itera automáticamente.
Puede llamar a la variable del cursor en el shell para iterar hasta 20 veces []1 e imprimir los documentos coincidentes, como en el siguiente ejemplo:
var myCursor = db.users.find( { type: 2 } ); myCursor
También puede utilizar el método del cursor para acceder a los documentos, como en el siguiente next() ejemplo:
var myCursor = db.users.find( { type: 2 } ); while (myCursor.hasNext()) { print(tojson(myCursor.next())); }
Como asistente de impresión alternativa, considera el método asistente printjson() para sustituir print(tojson()):
var myCursor = db.users.find( { type: 2 } ); while (myCursor.hasNext()) { printjson(myCursor.next()); }
Puede utilizar el método del cursor para iterar el cursor y acceder a los documentos, como en el siguiente forEach() ejemplo:
var myCursor = db.users.find( { type: 2 } ); myCursor.forEach(printjson);
Consulte los métodos de cursor de JavaScript y la documentación de su controlador para obtener más información sobre los métodos de cursor.
| [1] | (1, 2) Puedes configurar el atributo DBQuery.shellBatchSize para cambiar la cantidad de documentos desde el valor por defecto de 20. |
Índice de iteradores
mongoshEn, puede utilizar el método para iterar el cursor y devolver los documentos en una matriz, como en lo toArray() siguiente:
var myCursor = db.inventory.find( { type: 2 } ); var documentArray = myCursor.toArray(); var myDocument = documentArray[3];
El método carga en RAM todos toArray() toArray() los documentos devueltos por el cursor; el método agota el cursor.
Además, algunos controladores proporcionan acceso a los documentos mediante un índice en el cursor (porcursor[index] ejemplo,). Este método abreviado permite llamar primero al toArray() método y luego usar un índice en la matriz resultante.
Considera el siguiente ejemplo:
var myCursor = db.users.find( { type: 2 } ); var myDocument = myCursor[1];
El myCursor[1] es equivalente al siguiente ejemplo:
myCursor.toArray() [1];
Comportamientos del cursor
Cursores abiertos dentro de una sesión
A partir de MongoDB,5.0 los cursores creados dentro de una sesión de cliente se cierran cuando la sesión del servidor correspondiente finaliza con el killSessions comando, si la sesión expira o si el cliente ha agotado el cursor.
De forma predeterminada, las sesiones del servidor tienen un tiempo de expiración de 30 minutos. Para cambiar este valor, configure el parámetro localLogicalSessionTimeoutMinutes al mongod iniciar.
Cursores abiertos fuera de una sesión
Los cursores que no se abran en una sesión se cierran automáticamente después de 10 minutos de inactividad, o si el cliente ha agotado el cursor. Para sobrescribir este comportamiento en mongosh, puedes usar el método cursor.noCursorTimeout():
var myCursor = db.users.find().noCursorTimeout();
Después de configurar la noCursorTimeout opción, debe cerrar el cursor manualmente con o agotando los resultados del cursor.close() cursor.
Consulte la documentación de su controlador para obtener información sobre cómo configurar la opción. noCursorTimeout
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.
Agrupaciones de cursores
El servidor MongoDB devuelve los resultados de la consulta en lotes. La cantidad de datos del lote no superará el tamaño máximo del documento BSON. Para anular el tamaño predeterminado del lote, consulte batchSize() limit()y.
Novedad en la 3.4 versión: Las operaciones de find() aggregate()tipo,, listIndexes y devuelven un máximo listCollections de 16 megabytes por lote. puede imponer un límite menor, pero no unobatchSize() mayor.
find() Las aggregate() operaciones tienen un tamaño de lote inicial de 101 documentos por defecto. Las getMore operaciones posteriores ejecutadas contra el cursor resultante no tienen un tamaño de lote predeterminado, por lo que solo están limitadas por el 16 tamaño del mensaje de megabytes.
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.
Al iterar sobre el cursor y llegar al final del lote devuelto, si hay más resultados, cursor.next() ejecutará un para recuperar el siguiente lote. Para ver cuántos getMore operation objsLeftInBatch() documentos quedan en el lote al iterar sobre el cursor, puede usar el método, como en el siguiente ejemplo:
var myCursor = db.inventory.find(); var myFirstDocument = myCursor.hasNext() ? myCursor.next() : null; myCursor.objsLeftInBatch();
Información del cursor
El métododb.serverStatus()devuelve un documento que incluye un campometrics. El campometricscontiene un campometrics.cursorcon la siguiente información:
Número de cursores con tiempo de espera agotado desde el último reinicio del servidor
Número de cursores abiertos con la opción
DBQuery.Option.noTimeoutestablecida para evitar el tiempo de espera después de un período de inactividadNúmero de cursores abiertos "fijados"
número total de cursores abiertos
Considere el siguiente ejemplo que llama al método y accede db.serverStatus() al metrics campo de los resultados y luego al cursor campo del metrics campo:
db.serverStatus().metrics.cursor
El resultado es el siguiente documento:
{ "timedOut" : <number> "open" : { "noTimeout" : <number>, "pinned" : <number>, "total" : <number> } }