Menu Docs
Página inicial do Docs
/ / /
Kotlin Coroutine
/ / /

Limite o número de resultados retornados

Nesta página

  • Visão geral
  • Especifique um Limite
  • Combinando pular e limitar

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.

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(
@BsonId val id: Int,
val title: String,
val author: String,
val length: Int
)

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"))

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:

  • FindFlow.collect()

  • MongoCollection.find()

Voltar

Ignorar resultados devolvidos