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 Java.
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
A seguinte operação insere documentos representando livros em uma collection:
collection.insertMany(Arrays.asList( new Document().append("_id", 1) .append("title", "The Brothers Karamazov").append("length", 824) .append("author", "Dostoyevsky"), new Document().append("_id", 2) .append("title", "Les Misérables").append("length", 1462).append("author", "Hugo"), new Document().append("_id", 3) .append("title", "Atlas Shrugged").append("length", 1088).append("author", "Rand"), new Document().append("_id", 4) .append("title", "Infinite Jest").append("length", 1104).append("author", "Wallace"), new Document().append("_id", 5) .append("title", "Cryptonomicon").append("length", 918).append("author", "Stephenson"), new Document().append("_id", 6) .append("title", "A Dance with Dragons").append("length", 1104) .append("author", "Martin") ));
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 número de resultados a 3
documentos:
import com.mongodb.client.*; import org.bson.Document; import static com.mongodb.client.model.Sorts.descending; // ... // define a cursor that will return the first 3 sorted items MongoCursor<Document> cursor = collection.find() .sort(descending("length")) .limit(3) .iterator(); // print out items try { while (cursor.hasNext()) { System.out.println(cursor.next()); } } // close the cursor finally { cursor.close(); }
O exemplo de código anterior imprime os três documentos a seguir, classificados por tamanho:
Document{{_id=2, title=Les Misérables, author=Hugo, length=1462}} Document{{_id=6, title=A Dance with Dragons, author=Martin, length=1104}} Document{{_id=4, title=Infinite Jest, author=Wallace, length=1104}}
Dica
A ordem em que você chama limit()
e sort()
não importa porque o driver reordena as chamadas para aplicar primeiro a classificação 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()
, conforme mostrado no exemplo de código a seguir:
MongoCursor<Document> cursor = collection.find() .sort(descending("length")) .limit(3) .skip(3) .iterator();
Esta operação retorna os documentos que descrevem o quarto a sexto livros mais longos:
Document{{_id=3, title=Atlas Shrugged, author=Rand, length=1088}} Document{{_id=5, title=Cryptonomicon, author=Stephenson, length=918}} Document{{_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: