Overview
En esta guía, puede aprender a utilizar la operación de clasificación para ordenar los resultados de las operaciones de lectura con el controlador Java de MongoDB.
La operación de ordenamiento ordena los documentos devueltos por tu consulta según tus criterios de clasificación especificados. Los criterios de ordenación son las reglas que se pasan a MongoDB y que describen cómo se quiere ordenar los datos. Algunos ejemplos de criterios de ordenación son:
Del número más pequeño al número más grande
Hora más temprana del día a hora más tardía del día
Orden alfabético por nombre
Deberías leer esta guía si deseas:
Realizar ordenaciones ascendentes y descendentes.
Combinar criterios de clasificación.
Ordenar por puntuación de texto de un consulta de texto.
Los ejemplos de esta guía utilizan una colección de muestra que contiene los siguientes documentos:
{"_id": 1, "letter": "c", "food": "coffee with milk"} {"_id": 2, "letter": "a", "food": "donuts and coffee"} {"_id": 3, "letter": "a", "food": "maple syrup"} {"_id": 4, "letter": "b", "food": "coffee with sugar"} {"_id": 5, "letter": "a", "food": "milk and cookies"} {"_id": 6, "letter": "c", "food": "maple donut"}
Métodos de clasificación
Puede ordenar los resultados obtenidos por una consulta y dentro de una canalización de agregación. Para ordenar los resultados de su consulta, utilice el
sort() Método de una FindIterable instancia. Para ordenar los resultados dentro de una canalización de agregación, utilice el Aggregates.sort() método de fábrica estático. Ambos métodos reciben objetos que implementan la Bson interfaz como argumentos. Para más información, consulte nuestra documentación de la API para la interfaz BSON.
Puede utilizar el método sort() de una instancia FindIterable de la siguiente manera:
import static com.mongodb.client.model.Sorts.ascending; // <MongoCollection setup code here> collection.find().sort(ascending("_id"));
Puedes usar el método Aggregates.sort() dentro de un pipeline de agregación de la siguiente manera:
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"))));
Los fragmentos de código anteriores ordenan los documentos de la colección de muestra del valor más pequeño al más grande del _id campo:
{"_id": 1, "letter": "c", "food": "coffee with milk"} {"_id": 2, "letter": "a", "food": "donuts and coffee"} {"_id": 3, "letter": "a", "food": "maple syrup"} ...
En los fragmentos de código anteriores, especificamos nuestros criterios de ordenación mediante la clase constructora Sorts. Si bien es posible especificar criterios de ordenación mediante cualquier clase que implemente la interfaz Bson, recomendamos especificarlos mediante la clase constructora Sorts. Para obtener más información sobre la clase constructora Sorts, consulte nuestra
Guía sobre el constructor de ordenamientos.
Para obtener más información sobre las clases e interfaces en esta sección, consulte la siguiente documentación de API:
Dirección de clasificación
La dirección de ordenación puede ser ascendente o descendente.La ordenación ascendente ordena los resultados de menor a mayor. La ordenación descendente ordena los resultados de mayor a menor.
A continuación se muestran algunos ejemplos de datos ordenados en orden ascendente:
Numbers: 1, 2, 3, 43, 43, 55, 120
Dates: 1990-03-10, 1995-01-01, 2005-10-30, 2005-12-21
Palabras (ASCII): plátano, eneldo, zanahoria, pepino, hummus
A continuación se muestran algunos ejemplos de datos ordenados en orden descendente:
Numbers: 100, 30, 12, 12, 9, 3, 1
Dates: 2020-01-01, 1998-12-11, 1998-12-10, 1975-07-22
Palabras (ASCII inverso): pera, uvas, manzana, queso
Las siguientes subsecciones muestran cómo especificar estos criterios de clasificación.
Ascendente
Para especificar un orden ascendente, utilice el método de fábrica estático Sorts.ascending(). Pase al método Sorts.ascending() el nombre del campo que se ordenará en orden ascendente.
Puede pasar al método sort() la salida del método Sorts.ascending() para especificar una ordenación ascendente en un campo de la siguiente manera:
import static com.mongodb.client.model.Sorts.ascending; // <MongoCollection setup code here> collection.find().sort(ascending("<field name>"));
El método sort() anterior devuelve un objeto FindIterable que puede iterar sobre los documentos de su colección, ordenados del más pequeño al más grande según el nombre de campo especificado.
En el siguiente ejemplo de código, utilizamos el ascending() método para ordenar la colección de muestra por el _id campo:
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()); }
La salida del código anterior se parece a la siguiente:
{"_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 un orden descendente, utilice el método de fábrica estático Sorts.descending(). Pase al método Sorts.descending() el nombre del campo que se ordenará en orden descendente.
El siguiente fragmento de código muestra cómo especificar una ordenación descendente en el campo _id:
import static com.mongodb.client.model.Sorts.descending; // <MongoCollection setup code here> collection.find().sort(descending("_id"));
El fragmento de código anterior devuelve los documentos de la colección de muestra en orden descendente:
{"_id": 6, "letter": "c", "food": "maple donut"} {"_id": 5, "letter": "a", "food": "milk and cookies"} {"_id": 4, "letter": "b", "food": "coffee with sugar"} ...
Manejo de ataduras
Se produce un empate cuando dos o más documentos tienen valores idénticos en el campo que se utiliza para ordenar los resultados. MongoDB no garantiza el orden de ordenación en caso de empate. Por ejemplo, supongamos que encontramos un empate al aplicar una ordenación a la colección de muestra con el siguiente código:
import static com.mongodb.client.model.Sorts.ascending; // <MongoCollection setup code here> collection.find().sort(ascending("letter"));
Dado que varios documentos que coinciden con nuestra consulta contienen el valor "a" para el campo en el que realizamos la ordenación, los siguientes documentos se pueden devolver en cualquier orden:
{"_id": 3, "letter": "a", "food": "maple syrup"} {"_id": 5, "letter": "a", "food": "milk and cookies"} {"_id": 2, "letter": "a", "food": "donuts and coffee"}
Si debe garantizar un orden de clasificación específico para documentos que tienen campos con valores idénticos, puede especificar campos adicionales para ordenar en caso de empate.
Podemos especificar una ordenación ascendente en el campo letter seguido del campo _id de la siguiente manera:
import static com.mongodb.client.model.Sorts.ascending; // <MongoCollection setup code here> collection.find().sort(ascending("letter", "_id"));
El fragmento de código anterior devuelve los documentos de la colección de muestra en el siguiente orden:
{"_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"}
Combinación de criterios de ordenación
Para combinar criterios de ordenación, utilice el método de fábrica estático Sorts.orderBy(). Este método construye un objeto que contiene una lista ordenada de criterios de ordenación. Al realizar la ordenación, si el criterio de ordenación situado más a la izquierda resulta en un empate, se utiliza el siguiente criterio de ordenación de la lista para determinar el orden.
En el siguiente fragmento de código, utilizamos el método orderBy() para ordenar nuestros datos realizando una clasificación descendente en el campo letter y, en caso de empate, realizando una clasificación ascendente en el 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);
El fragmento de código anterior devuelve los documentos de la colección de muestra en el siguiente orden:
{"_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"}
Consulta de texto
Puede especificar el orden de los resultados de una consulta de texto según la coincidencia entre los valores de cadena de los campos de cada resultado, especificados por el índice de texto de la colección, y la cadena de búsqueda. La consulta de texto asigna una puntuación numérica para indicar la coincidencia de cada resultado con la cadena de búsqueda. Utilice el Sorts.metaTextScore() método de fábrica estático para crear sus criterios de ordenación y ordenar por puntuación de texto.
Importante
Asegúrese de crear un índice de texto
Necesita un índice de texto en su colección para realizar una consulta de texto. Consulte la documentación del manual del servidor para obtener más información sobre cómo crear un índice de texto.
En el siguiente ejemplo de código, mostramos cómo usar el Sorts.metaTextScore() método para ordenar los resultados de una búsqueda de texto en la colección de muestra. El ejemplo utiliza los constructores Filtros, Índices y Proyecciones. Realiza las siguientes acciones:
Crea un índice de texto para su colección de muestras en el
foodcampo. Si llama acreateIndex()especificando un índice ya existente en la colección, la operación no crea un nuevo índice.Ejecuta tu query de texto para la frase "maple donut".
Proyecta puntuaciones de texto en los resultados de tu consulta como el campo
score.Ordena los resultados por puntuación de texto (primero la mejor coincidencia).
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()); }
La salida del código anterior se parece a la siguiente:
{"_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}
Nota
Comportamiento de consultas de texto en MongoDB 4.4 o posterior
A partir de MongoDB 4.4, ya no se puede proyectar Projections.metaTextScore() en la instancia FindIterable para ordenar según la puntuación de texto. Además, se ignora el nombre de campo especificado en una operación de agregación de puntuación de texto $meta utilizada en una ordenación. Esto significa que el argumento de nombre de campo que se pasa a Sorts.metaTextScore() se ignora.
Para obtener más información sobre las clases de esta sección, consulte la siguiente documentación de API:
Para obtener más información, consulte la documentación de la API de la clase Sorts. Consulte la documentación del manual del servidor para obtener más información sobre el operador de consulta $text y el operador de canalización de agregación $meta.