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 la cantidad de documentos que una operación de lectura retorna. 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 utiliza limit() con el método de instancia skip(), el salto se aplica primero y el límite solo se aplica a los documentos restantes después del salto. Para obtener más información sobre el método skip(), consulte nuestro
guía para omitir documentos devueltos.
Los siguientes ejemplos demuestran, respectivamente, cómo insertar datos en una colección, cómo utilizar limit() para restringir el número de documentos devueltos y cómo combinar limit() con skip() para acotar aún más los resultados devueltos de una query.
Documentos de muestra
Las siguientes secciones incluyen 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 de Kotlin:
data class Book( val id: Int, val title: String, val author: String, val length: Int )
Indicar un límite
El siguiente ejemplo query la colección para devolver los tres libros más largos. Primero compara todos los documentos con la query y luego ordena el campo length para devolver los libros con mayores longitudes antes que los de longitudes más cortas. Por último, limita el valor de retorno a 3 documentos y devuelve los siguientes tres documentos, 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 porque el comando find siempre aplica primero la ordenación y luego el límite. Las dos siguientes llamadas son equivalentes:
collection.find().sort(descending("length")).limit(3) collection.find().limit(3).sort(descending("length"))
Combinar Skip y Limit
Para ver los tres libros más largos siguientes, añade el método skip() a tu llamada de find(). El argumento entero que se transmite a skip() determinará cuántos documentos devuelve la operación de búsqueda. Esta operación devuelve los documentos que describen el 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)
Puedes combinar skip() y limit() de esta manera para implementar la paginación de tu 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, considera 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 ordenaste solo por type, sort() no garantiza el mismo orden al regresar. Agregar skip() y limit() a sort() podría devolver documentos diferentes para consultas diferentes. En este caso, ordenar por data o serial_no garantizaría un ordenamiento estable, ya que ambos son claves únicas.
Para obtener más información sobre los métodos y clases mencionados en esta guía, consulta la siguiente Documentación de la API: