Overview
En esta guía, puedes aprender cómo limitar la cantidad de resultados devueltos por las operaciones de lectura con el controlador de Kotlin para MongoDB.
Usar limit() Para limitar el número de documentos que devuelve una operación de lectura. Este método de instancia designa el número máximo de documentos que una operación de lectura puede devolver. Si no hay suficientes documentos para alcanzar el límite especificado, puede devolver un número menor. Si usa limit() con el método de instancia skip(), la omisión se aplica primero y el límite solo se aplica a los documentos restantes después de la omisión. Para obtener más información sobre el método skip(), consulte nuestra
Guía sobre cómo omitir documentos devueltos.
Los siguientes ejemplos demuestran, respectivamente, cómo insertar datos en una colección, cómo usar limit() para restringir la cantidad de documentos devueltos y cómo combinar limit() con skip() para limitar aún más los resultados devueltos de una consulta.
Documentos de muestra
Las siguientes secciones presentan ejemplos que actualizan este documento de muestra:
{ "_id": 1, "title": "The Brothers Karamazov", "author": "Dostoyevsky", "length": 824 } { "_id": 2, "title": "Les Misérables", "author": "Hugo", "length": 1462 } { "_id": 3, "title": "Atlas Shrugged", "author": "Rand", "length": 1088 } { "_id": 4, "title": "Infinite Jest", "author": "Wallace", "length": 1104 } { "_id": 5, "title": "Cryptonomicon", "author": "Stephenson", "length": 918 } { "_id": 6, "title": "A Dance with Dragons", "author": "Martin", "length": 1104 }
Estos datos se modelan con la siguiente clase de datos Kotlin:
data class Book( val id: Int, val title: String, val author: String, val length: Int )
Especificar un límite
El siguiente ejemplo consulta la colección para devolver los tres libros más largos. Primero, compara todos los documentos con la consulta y, a continuación, ordena por el campo length para devolver los libros más largos antes que los más cortos. Finalmente, limita el valor de retorno a 3 documentos y devuelve los tres documentos siguientes, ordenados por longitud:
val results = collection.find() .sort(descending("length")) .limit(3) results.collect { println(it) }
Book(id=2, title=Les Misérables, author=Hugo, length=1462) Book(id=6, title=A Dance with Dragons, author=Martin, length=1104) Book(id=4, title=Infinite Jest, author=Wallace, length=1104)
Tip
El orden en que se llaman limit() y sort() no importa, ya que el comando find siempre aplica primero la ordenación y después el límite. Las dos llamadas siguientes son equivalentes:
collection.find().sort(descending("length")).limit(3) collection.find().limit(3).sort(descending("length"))
Combinando salto y límite
Para ver los siguientes tres libros más largos, añada el método skip() a su llamada find(). El argumento entero pasado a skip() determinará cuántos documentos devolverá la operación de búsqueda. Esta operación devuelve los documentos que describen del cuarto al sexto libro más largo:
val results = collection.find() .sort(descending("length")) .skip(3) .limit(3) results.collect { println(it) }
Book(id=3, title=Atlas Shrugged, author=Rand, length=1088) Book(id=5, title=Cryptonomicon, author=Stephenson, length=918) Book(id=1, title=The Brothers Karamazov, author=Dostoyevsky, length=824)
Puede combinar skip() y limit() de esta manera para implementar la paginación para su colección, devolviendo solo pequeños subconjuntos de la colección a la vez.
Nota
Para garantizar órdenes estables entre múltiples queries, debes ordenar utilizando una clave única (como _id). De lo contrario, una llamada a skip() y limit() puede producir resultados impredecibles cuando se combina con sort().
Por ejemplo, considere los siguientes datos:
{ type: "computer", data: "1", serial_no: 235235 } { type: "computer", data: "2", serial_no: 235237 } { type: "computer", data: "3", serial_no: 235239 } { type: "computer", data: "4", serial_no: 235241 }
Si ordena solo por type, sort() no garantiza el mismo orden al devolver los datos. Añadir skip() y limit() a sort() podría devolver documentos diferentes para distintas consultas. En este caso, ordenar por data o serial_no garantizaría una ordenación estable, ya que ambas son claves únicas.
Para obtener más información sobre los métodos y clases mencionados en esta guía, consulte la siguiente documentación de API: