Limite o número de resultados retornados
Visão geral
Neste guia, você pode aprender como limitar o número de resultados retornados de operações de leitura com o driver MongoDB Kotlin.
Use limit()
para limitar o número de documentos que uma operação de leitura gera. Este método de instância designa o número máximo de documentos que uma operação de leitura pode retornar. Se não houver documentos suficientes para atingir o limite especificado, ele poderá gerar um número menor. Se você usar limit()
com o método de instância skip()
, o salto será aplicado primeiro e o limite será aplicado somente aos documentos restantes após o salto. Para obter mais informações sobre o método skip()
, veja nosso guia sobre Como ignorar documentos gerados.
Os exemplos seguintes demonstram, respectivamente, como inserir dados em uma collection, como utilizar o limit()
para restringir o número de documentos retornados e como combinar o limit()
com skip()
para limitar ainda mais os resultados retornados de uma query.
Documentos de amostra
As seções a seguir apresentam exemplos que atualizam este documento de amostra:
{ "_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 }
Esses dados são modelados com a seguinte classe de dados Kotlin:
data class Book( val id: Int, val title: String, val author: String, val length: Int )
Especifique um Limite
O exemplo a seguir faz query na collection para gerar os três livros mais longos. Primeiro, ele combina todos os documentos com a query e, em seguida, classifica no campo length
para gerar livros com comprimentos mais longos antes de livros com comprimentos mais curtos. Por último, ele limita o valor de retorno a 3
documentos e retorna os três documentos a seguir, classificados por tamanho:
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)
Dica
A ordem em que você chama limit()
e sort()
não importa porque o comando find sempre aplica a classificação primeiro e o limite depois disso. As duas chamadas a seguir são equivalentes:
collection.find().sort(descending("length")).limit(3) collection.find().limit(3).sort(descending("length"))
Combinando pular e limitar
Para ver os próximos três livros mais longos, acrescente o método skip()
à sua chamada find()
. O argumento do número inteiro passado para skip()
determinará quantos documentos a operação de localização retornará. Esta operação retorna os documentos que descrevem o quarto a sétimo livros mais longos:
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)
É possível combinar skip()
e limit()
desta forma para implementar a paginação para a sua collection, retornando apenas pequenos subconjuntos da collection de uma só vez.
Observação
Para garantir classificações estáveis em várias consultas, você deve classificar usando uma chave exclusiva (como _id
). Caso contrário, uma chamada para skip()
e limit()
pode produzir resultados imprevisíveis quando combinada com sort()
.
Por exemplo, considere os seguintes dados:
{ 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 }
Se você classificou apenas por type
, o(a) sort()
não garante o mesmo pedido após a devolução. Anexar skip()
e limit()
ao sort()
pode devolver documentos diferentes para queries diferentes. Neste caso, classificar por data
ou serial_no
garantiria uma classificação estável, pois ambas são chaves únicas.
Para obter mais informações sobre os métodos e classes mencionados neste guia, consulte a seguinte documentação da API: