Definición
cursor.skip(<offset>)Importante
Método mongosh
Esta página documenta una
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.
Invoque el método en un cursor para controlar dónde MongoDB empieza a devolver resultados. Este enfoque puede ser útil para implementar resultados
skip()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:ParameterTipoDescripciónoffsetNúmero
El número de documentos que se omitirán en el conjunto de resultados.
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.
Comportamiento
Usando skip() con sort()
Si usa con, asegúrese de incluir al menos un campo en su clasificación que contenga valores únicos, antes de pasar los skip() sort()resultados skip() a.
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.
Usando skip() con limit()
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 que siempre producen los mismos resultados de consulta para el mismo conjunto de limit() datos:
db.myColl.find().sort({_id: 1}).skip(3).limit(6); db.myColl.find().sort({_id: 1}).limit(6).skip(3);
Ejemplo de paginación
Utilizando skip()
La siguiente función de JavaScript utiliza para paginar una colección por skip() su _id campo:
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 requiere que el servidor escanee desde el principio del conjunto de resultados skip() skip() de entrada antes de empezar a devolver resultados. A medida que aumenta el desplazamiento, se ralentizará.
Uso de consultas de rango
Las consultas de rango pueden usar índices para evitar escanear documentos no deseados, lo que generalmente produce un mejor rendimiento a medida que aumenta el desplazamiento en comparación con el uso de para la skip() paginación.
Orden descendente
Utilice este procedimiento para implementar la paginación con consultas de rango:
Elija un campo como
_idque generalmente cambia en una dirección consistente a lo largo del tiempo y tiene un índice único para evitar valores duplicados.Consulta de documentos cuyo campo sea menor que el valor inicial utilizando los operadores y,
$ltsort()yAlmacene el último valor del campo visto para la próxima consulta.
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 orden de los documentos más nuevos primero usando el _id campo (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 puede utilizar el siguiente código para imprimir todos los nombres de los estudiantes utilizando esta función de paginación, usando para comenzar desde la clave más grande MaxKey posible:
let currentKey = MaxKey; while (currentKey !== null) { currentKey = printStudents(currentKey, 10); }
Nota
Si bien los valores de ObjectId deberían aumentar con el tiempo, no son necesariamente 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.
Orden ascendente
La devolución de resultados paginados en orden ascendente es similar al anterior, pero utiliza $gt con un orden de clasificación 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 también es similar, pero con como clave de MinKey inicio:
let currentKey = MinKey; while (currentKey !== null) { currentKey = printStudents(currentKey, 10); }