Overview
En esta guía, puede aprender cómo utilizar la operación de ordenamiento para organizar sus resultados de 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 menor número al mayor número
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.
Combine los criterios de clasificación.
Ordenar según la puntuación de texto de un text query.
Los ejemplos en esta guía utilizan una colección de muestra que incluye 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 recuperados mediante una query y puede ordenar los resultados dentro de un pipeline de agregación. Para ordenar tus resultados de query, utiliza el
sort() método de una instancia de FindIterable. Para ordenar los resultados dentro de un pipeline de agregación, utiliza el método de fábrica estática Aggregates.sort(). Ambos métodos reciben objetos que implementan la interfaz Bson como argumentos. Para más información, consulta nuestra Documentación de API para la interfaz BSON.
Puedes usar el método sort() de una instancia de 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 siguientes fragmentos de código ordenan los documentos en la colección de muestras desde el valor más pequeño al más grande del 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"} ...
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 creador de tipos.
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
Aquí tienes 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, utiliza el método de fábrica estático Sorts.ascending(). Pase al método Sorts.ascending() el nombre del campo por el que desea ordenar en orden ascendente.
Puede pasar el 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() precedente devuelve un objeto FindIterable que puede iterar sobre los documentos de tu colección, ordenados de menor a mayor según el nombre del campo especificado.
En el siguiente ejemplo de código, utilizamos el método ascending() para ordenar la colección de muestras por el 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()); }
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 un orden 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 empates
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 query contienen el valor "a" para el campo sobre el cual realizamos la ordenación, se pueden devolver los siguientes documentos 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 un orden ascendente en el campo letter seguido por el 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 siguiente snippet de código 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 los criterios de ordenamiento, utilizar 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 más a la izquierda da lugar a un empate, la ordenación utiliza el siguiente criterio en 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 siguiente snippet de código 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
Puedes especificar el orden de los resultados de una query de texto según la proximidad con la que los valores de string de cada campo de resultado especificados por el índice de texto de la colección coincidan con tu string de búsqueda. La query de texto asigna un puntaje de texto numérico para indicar qué tan de cerca coincide cada resultado con la search string. Utiliza el método de fábrica estático Sorts.metaTextScore() para compilar tus criterios de ordenación y ordenar por el puntaje textual.
Importante
Asegúrese de crear un índice de texto
Necesita un índice de texto en su colección para realizar una query de texto. Consulta 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 puedes usar el método Sorts.metaTextScore() para ordenar los resultados de una búsqueda de texto en la colección de ejemplo. El ejemplo de código usa los desarrolladores Filtros, Índices, y Proyecciones. El ejemplo de código realiza las siguientes acciones:
Crea un índice de texto para tu colección de muestras en el campo
food. Si llamas acreateIndex()especificando un índice que ya existe en la colección, la operación no crea un índice nuevo.Ejecuta tu query de texto para la frase "maple donut".
Proyecta las puntuaciones de texto en los resultados de la 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 podrás proyectar Projections.metaTextScore() en tu instancia de FindIterable para ordenar según la puntuación de texto. Además, se ignora el nombre del campo que se especifica en una operación de agregación de puntuación de texto $meta usada en una ordenación. Esto significa que el argumento del nombre de campo quepasas 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 más información, véase la clase Sorts Documentación de la API. Consulta la documentación del manual del servidor Para obtener más información sobre el operador del query $text y el operador de pipeline de agregación $meta.