Menu Docs
Página inicial do Docs
/ / /
Driver de sincronização Java
/ / /

Classificar resultados

Nesta página

  • Visão geral
  • Métodos de classificação
  • Direção de classificação
  • Ascendente
  • Descendente
  • Lidar com empates
  • Combinando critérios de classificação
  • Pesquisa de texto

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:

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

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"}
...

In the preceding code snippets, we specify our sort criteria using the Sorts builder class. While it is possible to specify sort criteria using any class that implements the Bson interface, we recommend that you specify sort criteria through the Sorts builder. For more information about the Sorts builder class, see our guide on the Sorts builder.

Para obter mais informações sobre as classes e interfaces nesta seção, consulte a seguinte Documentação da API:

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.

Para especificar uma classificação ascendente, use o método de fábrica estático Sorts.ascending() . Passe para o método Sorts.ascending() o nome do campo para 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 código anterior se assemelha ao seguinte:

{"_id": 1, "letter": "c", "food": "coffee with milk"}
{"_id": 2, "letter": "a", "food": "donuts and coffee"}
{"_id": 3, "letter": "a", "food": "maple syrup"}
...

Para especificar uma classificação decrescente, use o método de fábrica estático Sorts.descending() . Passe para o método Sorts.descending() o nome do campo para ordenar 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"}
...

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 você precisar garantir uma ordem de classificação específica para documentos que tenham campos com valores idênticos, poderá 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"}

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

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:

  1. Cria um índice de texto para sua coleção de amostra no campo food . Se você chamar createIndex() especificando um índice que já existe na coleção, a operação não criará um novo índice.

  2. Executa seu texto Atlas Search a frase "maple donuts".

  3. Projeta pontuações de texto em seus resultados de query como o campo score .

  4. 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 código anterior se assemelha ao seguinte:

{"_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 mudou para o MongoDB 4.4 ou posterior. Você não projeta mais Projections.metaTextScore() em sua instância FindIterable para classificar na pontuação de texto. Além disso, o nome do campo especificado em uma operação de aggregation 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 do manual do servidor para obter mais informações sobre o operador de query $text e o operador de pipeline de agregação $meta .

← Fluxos de change streams