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 deben devolver como resultado de una query.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
Tu operación de consulta puede devolver una referencia a un cursor que contenga documentos coincidentes. Para aprender a examinar los datos almacenados en el cursor, consulta el Acceder a los 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 ordenación a una operación de lectura para garantizar que la operación devuelva primero los libros más largos y luego los libros más cortos:
// 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 usando un orden de clasificación especificado. En el ejemplo anterior, los documentos que tienen title valores de "A Dance with Dragons" y "Infinite Jest" ambos tienen un length de 1104, por lo que no se garantiza el orden en que se devuelven. Para resolver empates en sus resultados ordenados de manera repetible, agregue más campos al documento de ordenamiento:
// 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); }
Con la adición del campo author al documento de ordenación, la operación de lectura ordena los documentos coincidentes primero por length y, si hay empate, por author. Los campos de documentos coincidentes se comparan en el mismo orden en que se especifican los campos en el documento de ordenación. find() devuelve el siguiente orden de documentos cuando se utiliza este tipo de ordenación en los documentos que coinciden con la query:
{ "_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
Utiliza el método limit() para limitar el número de documentos que se pueden devolver de una operación de lectura. Este método especifica el número máximo de documentos que la operación puede devolver, pero la operación puede devolver un número menor de documentos si no hay suficientes documentos presentes para alcanzar el límite. Si se usa limit() con el skip() metodo, se omite la aplicación primero y el límite solo se aplica a los documentos restantes después de la omisión.
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() sobrepasa el número de documentos coincidentes de una query, entonces esa query no devuelve documentos.
Este ejemplo consulta la colección en busca de los libros con la quinta y sexta mayor longitud, 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 ordenación descendente en el campolength, lo que hace que se devuelvan los libros más largos antes que los más cortosLlama 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 query omite los primeros cuatro documentos coincidentes, el snippet de código anterior imprime el quinto y sexto documentos de mayor longitud:
{ "_id": 5, "title": "Cryptonomicon", "author": "Stephenson", "length": 918 } { "_id": 1, "title": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 }
Combine Limit, Sort y Skip
Puedes combinar las opciones limit, sort y skip en una sola operación. Esto permite establecer un número máximo de documentos ordenados para devolver, omitiendo un número especificado de documentos antes de la devolución.
El siguiente ejemplo devuelve documentos con el valor "1104" de length. Los resultados están ordenados alfabéticamente, omitiendo el primer documento y solo incluyendo 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 mencionados en esta guía, consulta la siguiente documentación de la API: