Classificar resultados
Nesta página
Visão geral
Neste guia, você pode aprender como usar a operação de classificação para ordenar seus resultados de operações de leitura com o driver MongoDB Java.
A operação de classificação ordena os documentos retornados da sua query de acordo com os critérios de classificação especificados. Os critérios de classificação são as regras que você passa para o MongoDB e descrevem como você gostaria que seus dados fossem ordenados. Alguns exemplos de critérios de classificação são:
Do menor número para o maior número
Hora do dia mais antiga para a última hora do dia
Ordem alfabética pelo nome
Leia este guia se quiser:
Executar classificações ascendentes e classificações descendentes.
Combine critérios de classificação.
Classifique na pontuação de texto de uma pesquisa de texto.
Os exemplos deste guia usam uma collection de amostras que contém os seguintes documentos:
{"_id": 1, "letter": "c", "food": "coffee with milk"} {"_id": 3, "letter": "a", "food": "maple syrup"} {"_id": 4, "letter": "b", "food": "coffee with sugar"} {"_id": 5, "letter": "a", "food": "milk and cookies"} {"_id": 2, "letter": "a", "food": "donuts and coffee"} {"_id": 6, "letter": "c", "food": "maple donut"}
Métodos de classificação
Você pode classificar os resultados recuperados por uma consulta e pode classificar os resultados dentro de um pipeline de agregação. Para classificar seus resultados de query, utilize o método sort()
de uma instância do FindIterable
. Para classificar seus resultados dentro de um pipeline de agregação, utilize o método de fábrica estático do Aggregates.sort()
. Ambos os métodos recebem objetos que implementam a interface Bson
como argumentos. Para obter mais informações, consulte nossa documentação de API para a interface BSON.
Você pode utilizar o método sort()
de uma instância do FindIterable
como segue:
import static com.mongodb.client.model.Sorts.ascending; // <MongoCollection setup code here> collection.find().sort(ascending("_id"));
Você pode usar o método Aggregates.sort()
dentro de um pipeline de agregação da seguinte maneira:
import com.mongodb.client.model.Aggregates; import static com.mongodb.client.model.Sorts.ascending; // <MongoCollection setup code here> collection.aggregate(Arrays.asList(Aggregates.sort(ascending("_id"))));
Os trechos de código anteriores classificam os documentos na coleção de amostra do menor para o maior valor do campo _id
:
{"_id": 1, "letter": "c", "food": "coffee with milk"} {"_id": 2, "letter": "a", "food": "donuts and coffee"} {"_id": 3, "letter": "a", "food": "maple syrup"} ...
Nos trechos de código anteriores, especificamos nossos critérios de classificação usando a classe de construtor Sorts
. Embora seja possível especificar critérios de classificação usando qualquer classe que implemente a interface Bson
, recomendamos que você especifique os critérios de classificação por meio do construtor Sorts
. Para obter mais informações sobre a classe de construtor Sorts
, consulte nosso guia de sobre o construtor de Sorts.
Para obter mais informações sobre as classes e interfaces nesta seção, consulte a seguinte Documentação da API:
Direção de classificação
A direção da sua classificação pode ser ascendente ou descendente. Uma classificação crescente ordena seus resultados do menor para o maior. Uma classificação decrescente ordena seus resultados do maior para o menor.
Aqui estão alguns exemplos de dados classificados em ordem crescente:
Números: 1, 2, 3, 43, 43, 55, 120
Datas: 10/03/1990, 01/1995, 30/10/2005, 21/12/2005
Palavras (ASCII): Banana, endro, cenoura, pepino, homus
Aqui estão alguns exemplos de dados classificados em ordem decrescente:
Números: 100, 30, 12, 12, 9, 3, 1
Datas: 01/2020, 11/12/1998, 10/12/1998, 22/07/1975
Palavras (ASCII reverso): pêra, Uva, Maçã, Queque
As subseções a seguir mostram como especificar esses critérios de classificação.
Ascendente
Para especificar uma classificação crescente, utilize o método de fábrica estática Sorts.ascending()
. Passe o método Sorts.ascending()
o nome do campo que você precisa classificar em ordem crescente.
Você pode passar o método sort()
para a saída do método Sorts.ascending()
para especificar uma classificação ascendente em um campo da seguinte forma:
import static com.mongodb.client.model.Sorts.ascending; // <MongoCollection setup code here> collection.find().sort(ascending("<field name>"));
O método sort()
anterior retorna um objeto FindIterable
que pode iterar sobre os documentos em sua coleção, classificados do menor para o maior no nome de campo especificado.
No exemplo de código a seguir, usamos o método ascending()
para classificar a coleção de amostras pelo campo _id
:
import static com.mongodb.client.model.Sorts.ascending; // <MongoCollection setup code here> List<Document> results = new ArrayList<>(); collection.find().sort(ascending("_id")).into(results); for (Document result : results) { System.out.println(result.toJson()); }
A saída do exemplo de código anterior deve ser semelhante a esta:
{"_id": 1, "letter": "c", "food": "coffee with milk"} {"_id": 2, "letter": "a", "food": "donuts and coffee"} {"_id": 3, "letter": "a", "food": "maple syrup"} ...
Descendente
Para especificar uma classificação decrescente, use o método de fábrica estática Sorts.descending()
. Passe o método Sorts.descending()
o nome do campo que você precisa classificar em ordem decrescente.
O seguinte trecho de código mostra como especificar uma classificação decrescente no campo _id
:
import static com.mongodb.client.model.Sorts.descending; // <MongoCollection setup code here> collection.find().sort(descending("_id"));
O trecho de código anterior retorna os documentos na coleção de amostras em ordem decrescente:
{"_id": 6, "letter": "c", "food": "maple donut"} {"_id": 5, "letter": "a", "food": "milk and cookies"} {"_id": 4, "letter": "b", "food": "coffee with sugar"} ...
Lidar com empates
Um empate ocorre quando dois ou mais documentos têm valores idênticos no campo que você está usando para ordenar seus resultados. O MongoDB não garante a ordem de classificação em caso de empate. Por exemplo, suponha que encontremos um empate ao aplicar uma classificação à coleção de amostras usando o código a seguir:
import static com.mongodb.client.model.Sorts.ascending; // <MongoCollection setup code here> collection.find().sort(ascending("letter"));
Como vários documentos que corresponderam à nossa query contêm o valor "a" para o campo no qual realizamos a classificação, os seguintes documentos podem ser retornados em qualquer ordem:
{"_id": 3, "letter": "a", "food": "maple syrup"} {"_id": 5, "letter": "a", "food": "milk and cookies"} {"_id": 2, "letter": "a", "food": "donuts and coffee"}
Se precisar garantir uma ordem de classificação específica para documentos que tenham campos com valores idênticos, você pode especificar campos adicionais para classificação em caso de empate.
Podemos especificar uma classificação ascendente no campo letter
seguido pelo campo _id
da seguinte maneira:
import static com.mongodb.client.model.Sorts.ascending; // <MongoCollection setup code here> collection.find().sort(ascending("letter", "_id"));
O trecho de código anterior retorna o documento na coleção de amostra na seguinte ordem:
{"_id": 2, "letter": "a", "food": "donuts and coffee"} {"_id": 3, "letter": "a", "food": "maple syrup"} {"_id": 5, "letter": "a", "food": "milk and cookies"} {"_id": 4, "letter": "b", "food": "coffee with sugar"} {"_id": 1, "letter": "c", "food": "coffee with milk"} {"_id": 6, "letter": "c", "food": "maple donut"}
Combinando critérios de classificação
Para combinar critérios de classificação, use o método de fábrica estática Sorts.orderBy()
. Este método constrói um objeto contendo uma lista ordenada de critérios de classificação. Ao executar a classificação, se os critérios de classificação mais à esquerda resultarem em um empate, a classificação usará o próximo critério de classificação na lista para determinar a ordem.
No trecho de código a seguir, usamos o método orderBy()
para ordenar nossos dados, realizando uma classificação decrescente no campo letter
e, no caso de um empate, executando uma classificação ascendente no campo _id
.
import static com.mongodb.client.model.Sorts.orderBy; import static com.mongodb.client.model.Sorts.ascending; import static com.mongodb.client.model.Sorts.descending; // <MongoCollection setup code here> Bson orderBySort = orderBy(descending("letter"), ascending("_id")); collection.find().sort(orderBySort);
O trecho de código anterior retorna o documento na coleção de amostra na seguinte ordem:
{"_id": 1, "letter": "c", "food": "coffee with milk"} {"_id": 6, "letter": "c", "food": "maple donut"} {"_id": 4, "letter": "b", "food": "coffee with sugar"} {"_id": 2, "letter": "a", "food": "donuts and coffee"} {"_id": 3, "letter": "a", "food": "maple syrup"} {"_id": 5, "letter": "a", "food": "milk and cookies"}
Pesquisa de texto
Você pode especificar a ordem dos resultados de uma de texto Atlas Search considerando a proximidade dos string valores de de cada campo de resultado especificados pelo índice de texto da coleção à sua Atlas Search string do . O texto do Atlas Search atribui uma pontuação numérica de texto para indicar até que ponto cada resultado corresponde à Atlas Search string do . Use o método de fábrica estática Sorts.metaTextScore()
para criar seus critérios de classificação para classificar pela pontuação de texto.
Importante
Certifique-se de criar um índice de texto
Você precisa de um índice de texto em sua collection para executar uma Atlas Search de texto . Consulte a documentação do manual do servidor para obter mais informações sobre como criar um índice de texto.
No exemplo de código a seguir, mostramos como você pode usar o método Sorts.metaTextScore()
para classificar os resultados de um Atlas Search de texto na coleção de amostras. O exemplo de código utiliza os construtores Filtros, Índices e Projeções . O exemplo de código executa as seguintes ações:
Cria um índice de texto para sua coleção de amostra no campo
food
. Se você chamarcreateIndex()
especificando um índice que já existe na coleção, a operação não criará um novo índice.Executa seu texto Atlas Search a frase "maple donuts".
Projeta pontuações de texto em seus resultados de query como o campo
score
.Classifica seus resultados por pontuação de texto (primeira correspondência).
import com.mongodb.client.model.Sorts; import com.mongodb.client.model.Projections; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Indexes; // <MongoCollection setup code here> collection.createIndex(Indexes.text("food")); Bson metaTextScoreSort = Sorts.metaTextScore("score"); Bson metaTextScoreProj = Projections.metaTextScore("score"); String searchTerm = "maple donut"; Bson searchQuery = Filters.text(searchTerm); collection.find(searchQuery) .projection(metaTextScoreProj) .sort(metaTextScoreSort) .into(results); for (Document result : results) { System.out.println(result.toJson()); }
A saída do exemplo de código anterior deve ser semelhante a esta:
{"_id": 6, "letter": "c", "food": "maple donut", "score": 1.5} {"_id": 2, "letter": "a", "food": "donuts and coffee", "score": 0.75} {"_id": 3, "letter": "a", "food": "maple syrup", "score": 0.75}
Observação
Comportamento do Atlas Search por texto no MongoDB 4.4 ou posterior
A estrutura da pesquisa de texto foi alterada para MongoDB 4.4 ou posterior. Você não precisa mais projetar Projections.metaTextScore()
na sua instância FindIterable
para ordenar na pontuação do texto. Além disso, o nome do campo especificado em uma operação de agregação de pontuação de texto $meta
usada em uma classificação é ignorado. Isso significa que o argumento do nome do campo que você passa para Sorts.metaTextScore()
é desconsiderado.
Para obter mais informações sobre as aulas nesta seção, consulte a seguinte documentação da API:
Para obter mais informações, consulte a classe Classificações Documentação da API. Consulte a documentação manual do servidor para obter mais informações sobre o operador de query $text e o operador de pipeline de agregação $meta .