Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

cursor.skip() (método mongosh)

cursor.skip(<offset>)

Importante

Método mongosh

Esta página documenta a Método mongosh. Esta no es la documentación de un driver de lenguaje específico, como Node.js.

Para los drivers de API de MongoDB, consulte la documentación del driver de MongoDB específica del lenguaje.

Llama al método skip() sobre un cursor para controlar desde dónde comienza MongoDB a devolver resultados. Este enfoque puede ser útil para implementar resultados paginados.

Nota

Debes aplicar skip() al cursor antes de recuperar cualquier documento de la base de datos.

El método skip() tiene el siguiente parámetro:

Parameter
Tipo
Descripción

offset

Número

La cantidad de documentos que se deben omitir en el conjunto de resultados.

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.

Si se utiliza skip() junto con sort(), asegúrese de incluir al menos un campo en su orden que contenga valores únicos, antes de pasar los resultados a skip().

La ordenación en campos que contienen valores duplicados puede devolver un orden de clasificación inconsistente para esos campos duplicados en múltiples ejecuciones, especialmente cuando la colección está recibiendo activamente escrituras.

La forma más sencilla de garantizar la coherencia de ordenamiento es incluir el campo _id en la query de ordenación.

Consulta Ordenación coherente con el método sort() para obtener más información.

Cuando encadenas skip() y limit(), el orden de encadenamiento de los métodos no afecta los resultados. El servidor siempre aplica la operación de omitir según el orden de clasificación antes de aplicar el límite de cuántos documentos retornará.

El siguiente ejemplo de código muestra diferentes órdenes de encadenamiento para skip() y limit() que siempre producen los mismos resultados de query para el mismo conjunto de datos:

db.myColl.find().sort({_id: 1}).skip(3).limit(6);
db.myColl.find().sort({_id: 1}).limit(6).skip(3);

La siguiente función de JavaScript utiliza skip() para paginar una colección por su campo _id:

function printStudents(pageNumber, nPerPage) {
print( "Page: " + pageNumber );
db.students.find()
.sort( { _id: 1 } )
.skip( pageNumber > 0 ? ( ( pageNumber - 1 ) * nPerPage ) : 0 )
.limit( nPerPage )
.forEach( student => {
print( student.name );
} );
}

El método skip() requiere que el servidor escanee desde el principio del conjunto de resultados de entrada antes de comenzar a devolver los resultados. A medida que el desfase aumenta, skip() se volverá más lento.

Las búsquedas por rango pueden usar índices para evitar recorrer documentos no deseados, generalmente obteniendo un mejor rendimiento a medida que aumenta el offset en comparación con el uso de skip() para la paginación.

Utiliza este procedimiento para implementar la paginación con consultas de rango:

  • Elija un campo, como _id, que generalmente cambie en una dirección coherente a lo largo del tiempo y que tenga un índice único para evitar valores duplicados,

  • Realiza una query para los documentos cuyo campo sea menor que el valor inicial utilizando los operadores $lt y sort(), y

  • Almacenar el valor del campo visto por última vez para la siguiente query.

Por ejemplo, la siguiente función utiliza el procedimiento anterior para imprimir páginas de nombres de estudiantes de una colección, ordenados aproximadamente en el orden de los documentos más recientes primero utilizando el campo _id (es decir, en orden descendente):

function printStudents(startValue, nPerPage) {
let endValue = null;
db.students.find( { _id: { $lt: startValue } } )
.sort( { _id: -1 } )
.limit( nPerPage )
.forEach( student => {
print( student.name );
endValue = student._id;
} );
return endValue;
}

Luego puedes utilizar el siguiente código para imprimir todos los nombres de estudiantes utilizando esta función de paginación, con MaxKey para empezar desde la clave más grande posible:

let currentKey = MaxKey;
while (currentKey !== null) {
currentKey = printStudents(currentKey, 10);
}

Nota

Aunque los valores de ObjectId deberían aumentar con el tiempo, no necesariamente son monótonos. Esto se debe a que:

  • Solo contienen un segundo de resolución temporal, por lo que los valores de ObjectId creados dentro del mismo segundo no tienen un orden garantizado, y

  • Son generados por los clientes, que pueden tener relojes del sistema diferentes.

Devolver resultados paginados en orden ascendente es similar al anterior, pero utiliza $gt con un orden ascendente:

function printStudents(startValue, nPerPage) {
let endValue = null;
db.students.find( { _id: { $gt: startValue } } )
.sort( { _id: 1 } )
.limit( nPerPage )
.forEach( student => {
print( student.name );
endValue = student._id;
} );
return endValue;
}

El uso de esta función es igualmente similar, pero con MinKey como clave inicial:

let currentKey = MinKey;
while (currentKey !== null) {
currentKey = printStudents(currentKey, 10);
}

Volver

cursor.size

En esta página