Overview
En esta guía, puedes aprender a especificar qué documentos devolver de una operación de lectura utilizando los siguientes métodos:
sort(): Especifica el orden de clasificación de los documentos devueltos.limit(): Especifica el número máximo de documentos que se devolverán de una consulta.skip(): Especifica la cantidad de documentos que se deben omitir antes de devolver los resultados de la consulta.
Datos de muestra para ejemplos
Para ejecutar los ejemplos de esta guía, utiliza el siguiente snippet de código para insertar documentos que describen libros en la colección myDB.books:
const myDB = client.db("myDB"); const myColl = myDB.collection("books"); await myColl.insertMany([ { "_id": 1, "name": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 }, { "_id": 2, "name": "Les Misérables", "author": "Hugo", "length": 1462 }, { "_id": 3, "name": "Atlas Shrugged", "author": "Rand", "length": 1088 }, { "_id": 4, "name": "Infinite Jest", "author": "Wallace", "length": 1104 }, { "_id": 5, "name": "Cryptonomicon", "author": "Stephenson", "length": 918 }, { "_id": 6, "name": "A Dance With Dragons", "author": "Martin", "length": 1104 }, ]);
Nota
Se debe encadenar un método de cursor como sort(), limit(), skip() o project() a una operación de lectura antes de iterar el cursor. Si se especifica un método de cursor después de iterar el cursor, la configuración no se aplica a la operación de lectura.
Nota
Su consulta puede devolver una referencia a un cursor que contiene documentos coincidentes. Para saber cómo examinar los datos almacenados en el cursor, consulte Acceder a datos desde una página de cursor.
Sort
Utilice el método sort() para cambiar el orden en que las operaciones de lectura devuelven los documentos. Este método indica a MongoDB que ordene los documentos devueltos según los valores de uno o más campos en una dirección determinada. Para ordenar los documentos devueltos por un campo en orden ascendente (de menor a mayor), utilice el valor 1. Para ordenar en orden descendente (de mayor a menor), utilice -1. Si no especifica un orden, MongoDB no garantiza el orden de los resultados de la consulta.
El siguiente ejemplo pasa el documento de clasificación a una operación de lectura para garantizar que la operación devuelva los libros con longitudes más largas antes que los libros con longitudes más cortas:
// define an empty query document const query = {}; // sort in descending (-1) order by length const sortFields = { length: -1 }; const cursor = myColl.find(query).sort(sortFields); for await (const doc of cursor) { console.dir(doc); }
En este caso, el número -1 indica a la operación de lectura que ordene los libros en orden descendente por longitud. find() devuelve los siguientes documentos cuando se utiliza esta clasificación con una consulta vacía:
{ "_id": 2, "title": "Les Misérables", "author": "Hugo", "length": 1462 } { "_id": 4, "title": "Infinite Jest", "author": "Wallace", "length": 1104 } { "_id": 6, "title": "A Dance with Dragons", "author": "Martin", "length": 1104 } { "_id": 3, "title": "Atlas Shrugged", "author": "Rand", "length": 1088 } { "_id": 5, "title": "Cryptonomicon", "author": "Stephenson", "length": 918 } { "_id": 1, "title": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 }
A veces, el orden de dos o más documentos es ambiguo al usar una ordenación específica. En el ejemplo anterior, los documentos con valores title de "A Dance with Dragons" y "Infinite Jest" tienen ambos valores length de 1104, por lo que no se garantiza el orden en que se devuelven. Para resolver los empates en los resultados ordenados de forma repetible, agregue más campos al documento de ordenación:
// define an empty query document const query = {}; // sort in ascending (1) order by length const sortFields = { length: 1, author: 1 }; const cursor = myColl.find(query).sort(sortFields); for await (const doc of cursor) { console.dir(doc); }
Al añadir el campo author al documento de ordenación, la operación de lectura ordena los documentos coincidentes primero por length y, si hay un empate, por author. Los campos de los documentos coincidentes se comparan en el mismo orden en que se especifican en el documento de ordenación. find() devuelve el siguiente orden de documentos cuando se utiliza esta ordenación en los documentos que coinciden con la consulta:
{ "_id": 1, "title": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 } { "_id": 5, "title": "Cryptonomicon", "author": "Stephenson", "length": 918 } { "_id": 3, "title": "Atlas Shrugged", "author": "Rand", "length": 1088 } { "_id": 6, "title": "A Dance with Dragons", "author": "Martin", "length": 1104 } { "_id": 4, "title": "Infinite Jest", "author": "Wallace", "length": 1104 } { "_id": 2, "title": "Les Misérables", "author": "Hugo", "length": 1462 }
Limit
Utilice el método limit() para limitar el número de documentos que se pueden devolver en una operación de lectura. Este método especifica el número máximo de documentos que la operación puede devolver, pero puede devolver un número menor si no hay suficientes documentos para alcanzar el límite. Si se utiliza limit() con el método método skip(), el salto se aplica primero y el límite solo se aplica a los documentos que quedan después del salto.
Este ejemplo realiza las siguientes acciones:
Utiliza un filtro de consulta vacío para hacer coincidir todos los documentos de la colección
Llama al método
sort()para aplicar una ordenación descendente en el campolengtha los resultadosLlama al método
limit()para devolver solo los primeros3resultados
// define an empty query document const query = {}; // sort in descending (-1) order by length const sortFields = { length: -1 }; const limitNum = 3; const cursor = myColl.find(query).sort(sortFields).limit(limitNum); for await (const doc of cursor) { console.dir(doc); }
El ejemplo de código anterior genera los siguientes tres documentos, ordenados por longitud:
{ "_id": 2, "title": "Les Misérables", "author": "Hugo", "length": 1462 } { "_id": 6, "title": "A Dance With Dragons", "author": "Martin", "length": 1104 } { "_id": 4, "title": "Infinite Jest", "author": "Wallace", "length": 1104 }
Nota
El orden en el que llames a limit() y sort() no importa porque el controlador reordena las llamadas para aplicar primero la ordenación. Las dos siguientes llamadas son equivalentes:
myColl.find(query).sort({ length: -1 }).limit(3); myColl.find(query).limit(3).sort({ length: -1 });
Omitir
Utilice el método skip() para omitir documentos desde el principio de los resultados de la operación de lectura. Puedes combinar skip() con sort() para omitir los resultados superiores (para orden descendente) o inferiores (para orden ascendente) para una query determinada. Dado que el orden de los documentos devueltos no está garantizado en ausencia de un ordenamiento, usar skip() sin usar sort() omite documentos arbitrarios.
Si el valor de skip() excede la cantidad de documentos coincidentes para una consulta, entonces esa consulta no devuelve ningún documento.
Este ejemplo consulta la colección de los libros con la quinta y sexta longitud más alta realizando las siguientes acciones:
Utiliza un filtro de consulta vacío para hacer coincidir todos los documentos de la colección
Llama al método
sort()para aplicar una clasificación descendente al campolength, que devuelve los libros más largos antes que los más cortos.Llama al método
skip()para omitir los primeros cuatro documentos coincidentes del resultado
// define an empty query document const query = {}; const sortFields = { length: -1 }; const skipNum = 4; const cursor = myColl.find(query).sort(sortFields).skip(skipNum); for await (const doc of cursor) { console.dir(doc); }
Dado que la consulta omite los primeros cuatro documentos coincidentes, el fragmento de código anterior imprime el quinto y el sexto documento de mayor longitud:
{ "_id": 5, "title": "Cryptonomicon", "author": "Stephenson", "length": 918 } { "_id": 1, "title": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 }
Combinar límite, ordenar y omitir
Puede combinar las opciones limit, sort y skip en una sola operación. Esto le permite establecer un número máximo de documentos ordenados para devolver, omitiendo un número específico de documentos antes de devolverlos.
El siguiente ejemplo devuelve documentos con el valor length de "1104". Los resultados se ordenan alfabéticamente, omitiendo el primer documento e incluyendo solo el primer resultado:
const query = {length: "1104"}; const cursor = myColl.find(query).sort({ title: 1 }).skip(1).limit(1); for await (const doc of cursor) { console.dir(doc); }
{ "_id": 4, "title": "Infinite Jest", "author": "Wallace", "length": 1104 }
Nota
El orden en que llama a estos métodos no cambia los documentos que se devuelven.
Información Adicional
Para obtener más información sobre cómo especificar una consulta, consulte Operaciones de consulta.
Para más información sobre cómo recuperar documentos, visita Buscar documentos.
Documentación de la API
Para obtener más información sobre cualquiera de los métodos analizados en esta guía, consulte la siguiente documentación de API: