Definición
cursor.sort(sort)Importante
Método mongosh
Este es un método.
mongoshEsta no es la documentación deNode.jsni de otros métodos de controlador específicos del lenguaje de programación.En la mayoría de los casos, los métodos funcionan de la misma manera que los
mongoshheredados.mongoMétodos de shell. Sin embargo, algunos métodos heredados no están disponiblesmongoshen.Para obtener la documentación del shell heredado, consulte la documentación de la versión correspondiente de MongoDB
mongoServer:Para los controladores de la API de MongoDB, consultar la documentación específica del controlador de MongoDB para cada lenguaje.
Especifica el orden en el que el query devuelve los documentos que coinciden. Debes aplicar
sort()al cursor antes de recuperar cualquier documento de la base de datos.
Compatibilidad
Este método está disponible en implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Nota
Este comando es compatible con todos los clústeres de MongoDB Atlas. Para obtener información sobre el soporte de Atlas para todos los comandos, consulte Comandos no compatibles.
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
El método sort() tiene el siguiente parámetro:
Parameter | Tipo | Descripción |
|---|---|---|
| Documento | Un documento que define el orden de clasificación del conjunto de resultados. |
El parámetro sort contiene pares de campo y valor, en la forma siguiente:
{ field: value }
El documento de ordenación puede especificar orden ascendente o descendente en campos existentes u orden en los metadatos de puntuación de texto.
Comportamiento
Límites
Puedes ordenar sobre un máximo de 32 claves.
Proveer un patrón de ordenación con campos duplicados causa un error.
Coherencia de clasificación
MongoDB no almacena documentos en una colección en un orden específico. Al ordenar en un campo que contiene valores duplicados, los documentos que contienen esos valores pueden ser devueltos en cualquier orden.
Si se desea un orden de clasificación coherente, se debe incluir al menos un campo en la clasificación que contenga valores únicos. La forma más sencilla de garantizar esto es incluir el campo _id en la query de ordenación.
Considere la siguiente colección restaurant:
db.restaurants.insertMany( [ { "_id" : 1, "name" : "Central Park Cafe", "borough" : "Manhattan"}, { "_id" : 2, "name" : "Rock A Feller Bar and Grill", "borough" : "Queens"}, { "_id" : 3, "name" : "Empire State Pub", "borough" : "Brooklyn"}, { "_id" : 4, "name" : "Stan's Pizzaria", "borough" : "Manhattan"}, { "_id" : 5, "name" : "Jane's Deli", "borough" : "Brooklyn"}, ] );
El siguiente comando utiliza el método sort() para ordenar en el campo borough:
db.restaurants.find().sort( { "borough": 1 } )
En este ejemplo, el orden de clasificación puede ser inconsistente, ya que el campo borough contiene valores duplicados tanto para Manhattan como para Brooklyn. Los documentos se devuelven en orden alfabético por borough, pero el orden de aquellos documentos con valores duplicados para borough podría no ser el mismo en múltiples ejecuciones del mismo ordenamiento. Por ejemplo, aquí están los resultados de dos ejecuciones diferentes del comando mencionado anteriormente:
{ "_id" : 3, "name" : "Empire State Pub", "borough" : "Brooklyn" } { "_id" : 5, "name" : "Jane's Deli", "borough" : "Brooklyn" } { "_id" : 1, "name" : "Central Park Cafe", "borough" : "Manhattan" } { "_id" : 4, "name" : "Stan's Pizzaria", "borough" : "Manhattan" } { "_id" : 2, "name" : "Rock A Feller Bar and Grill", "borough" : "Queens" } { "_id" : 5, "name" : "Jane's Deli", "borough" : "Brooklyn" } { "_id" : 3, "name" : "Empire State Pub", "borough" : "Brooklyn" } { "_id" : 4, "name" : "Stan's Pizzaria", "borough" : "Manhattan" } { "_id" : 1, "name" : "Central Park Cafe", "borough" : "Manhattan" } { "_id" : 2, "name" : "Rock A Feller Bar and Grill", "borough" : "Queens" }
Aunque los valores para borough aún se ordenan alfabéticamente, el orden de los documentos que contienen valores duplicados para borough (es decir, Manhattan y Brooklyn) no son lo mismo.
Para lograr una clasificación coherente, agrega un campo que contenga valores exclusivamente únicos a la clasificación. El siguiente comando utiliza el método sort() para ordenar tanto el campo borough como el campo _id:
db.restaurants.find().sort( { "borough": 1, "_id": 1 } )
Dado que siempre se garantiza que el campo _id contendrá valores exclusivamente únicos, el orden de clasificación devuelto siempre será el mismo en múltiples ejecuciones del mismo ordenamiento.
Orden ascendente/descendente
Especifica en el parámetro de clasificación el campo o los campos por los que vas a ordenar y un valor de 1 o -1 para especificar un orden ascendente o descendente, respectivamente.
La siguiente operación ordena los documentos primero por el campo age en orden descendente y luego por el campo posts en orden ascendente:
db.users.find({ }).sort( { age : -1, posts: 1 } )
Al comparar valores de diferentes BSON types en operaciones de ordenación, MongoDB utiliza el siguiente orden de comparación, de menor a mayor:
MinKey (tipo interno)
Nulo
Números (enteros, largos, dobles, decimales)
Símbolo, string
Objeto
Arreglo
BinData
ObjectId
Booleano
fecha
Marca de tiempo
Expresión regular
Código JavaScript
MaxKey (tipo interno)
Para obtener detalles sobre el orden de comparación o clasificación para tipos específicos, consulte el orden de comparación o clasificación.
Text Score Metadata Sort
Nota
$text Proporciona funciones de consulta de texto para implementaciones autogestionadas (no Atlas). Para los datos alojados en MongoDB Atlas, MongoDB ofrece una solución mejorada de consulta de texto completo: Atlas Search.
Si se usa $text, puede ordenar por puntuación de relevancia descendente usando la expresión { $meta: "textScore" }.
El siguiente documento de muestra especifica un orden descendente por los metadatos "textScore":
db.users.find( { $text: { $search: "operating" } }, { score: { $meta: "textScore" }} ).sort({ score: { $meta: "textScore" } })
Los metadatos "textScore" se colocan en orden descendente.
Para obtener más información, consulta $meta para obtener más detalles.
Ordenar por un campo de arreglo
Cuando MongoDB ordena documentos por un campo cuyo valor es un arreglo, la clave de ordenación depende de si el orden es ascendente o descendente:
En una ordenación ascendente, la clave de ordenación es el valor más bajo del arreglo.
En una ordenación descendente, la clave de ordenación es el valor más alto del arreglo.
El filtro de query no afecta la selección de la clave de ordenación.
Por ejemplo, cree una colección shoes con estos documentos:
db.shoes.insertMany( [ { _id: 'A', sizes: [ 7, 11 ] }, { _id: 'B', sizes: [ 8, 9, 10 ] } ] )
Las siguientes queries ordenan los documentos por el campo sizes en orden ascendente y descendente:
// Ascending sort db.shoes.find().sort( { sizes: 1 } ) // Descending sort db.shoes.find().sort( { sizes: -1 } )
Ambas queries anteriores devuelven el documento con _id: 'A' primero porque los tamaños 7 y 11 son el más bajo y el más alto en las entradas del arreglo sizes, respectivamente.
La siguiente consulta busca zapatos con tamaños mayores a 10 y ordena los resultados por tamaño de zapato en orden ascendente:
db.shoes.find( { sizes: { $gte: 7 } } ).sort( { sizes: 1 } )
Esta consulta devuelve el documento con _id: 'A' primero aunque el filtro incluye una condición en sizes mayor que 7 porque el filtro de consulta no afecta la selección de la clave de ordenación.
Uso de ordenación e índice
MongoDB puede obtener los resultados de una operación de ordenación de un índice que incluya los campos de ordenación. MongoDB puede usar múltiples índices para dar soporte a una operación de ordenación si la ordenación utiliza los mismos índices que el predicado del query.
Si MongoDB no puede usar uno o más índices para obtener el orden de ordenación, debe realizar una ordenación por bloqueo de los datos. Esta ordenación indica que MongoDB debe consumir y procesar todos los documentos de entrada antes de devolver los resultados. Las ordenaciones por bloqueo no bloquean las operaciones concurrentes en la colección o la base de datos.
Las operaciones de ordenación que utilizan un índice suelen tener un mejor rendimiento que las ordenaciones por bloqueo. Para obtener más información sobre la creación de índices compatibles con las operaciones de ordenación, consulte Usar índices para ordenar los resultados de una consulta.
Si MongoDB requiere utilizar más de 100 megabytes de memoria del sistema para la operación de ordenamiento por bloqueo, MongoDB devuelve un error a menos que la consulta cursor.allowDiskUse() especifique. permite a MongoDB utilizar archivos temporales enallowDiskUse() el disco para almacenar datos que excedan el 100 límite de memoria del sistema de megabytes mientras procesa una operación de ordenamiento por bloqueo.
Para comprobar si MongoDB debe realizar un ordenamiento bloqueante, añade cursor.explain() a la query y comprueba los resultados de explicar. Si el plan del query contiene una etapa SORT, entonces MongoDB debe realizar una operación de ordenamiento bloqueante sujeta al límite de memoria de 100 megabytes.
Para evitar que los tipos de bloqueo consuman demasiada memoria:
Crea un índice para brindar soporte a la operación de ordenamiento. Consulta Usar índices para ordenar los resultados del query para obtener más información y ejemplos.
Limite la cantidad de datos a ordenar utilizando
cursor.limit()concursor.sort(). Consulte Limitar Resultados para obtener más información y ejemplos.
Limitar los resultados
Puedes usar sort() junto con limit() para devolver los primeros documentos k (en términos del orden de clasificación), donde k es el límite especificado.
Si MongoDB no puede obtener el orden de clasificación mediante un escaneo de índices, entonces MongoDB utiliza un algoritmo de clasificación top-k. Este algoritmo almacena en búfer los primeros k resultados (o los últimos, según el orden de clasificación) vistos hasta ahora por el índice subyacente o el acceso a la colección. Si en algún momento, la huella de memoria de estos resultados k supera los 100 megabytes, la consulta fallará a menos que dicha consulta especifique cursor.allowDiskUse().
Interacción con la proyección
Cuando un conjunto de resultados se ordena y proyecta, el motor de consulta MongoDB siempre aplicará primero la ordenación.
Ejemplos
Una colección orders contiene los siguientes documentos:
{ _id: 1, item: { category: "cake", type: "chiffon" }, amount: 10 } { _id: 2, item: { category: "cookies", type: "chocolate chip" }, amount: 50 } { _id: 3, item: { category: "cookies", type: "chocolate chip" }, amount: 15 } { _id: 4, item: { category: "cake", type: "lemon" }, amount: 30 } { _id: 5, item: { category: "cake", type: "carrot" }, amount: 20 } { _id: 6, item: { category: "brownies", type: "blondie" }, amount: 10 }
El siguiente query, que devuelve todos los documentos de la colección orders, no especifica un orden de clasificación:
db.orders.find()
La query devuelve los documentos en un orden indeterminado:
{ "_id" : 1, "item" : { "category" : "cake", "type" : "chiffon" }, "amount" : 10 } { "_id" : 2, "item" : { "category" : "cookies", "type" : "chocolate chip" }, "amount" : 50 } { "_id" : 3, "item" : { "category" : "cookies", "type" : "chocolate chip" }, "amount" : 15 } { "_id" : 4, "item" : { "category" : "cake", "type" : "lemon" }, "amount" : 30 } { "_id" : 5, "item" : { "category" : "cake", "type" : "carrot" }, "amount" : 20 } { "_id" : 6, "item" : { "category" : "brownies", "type" : "blondie" }, "amount" : 10 }
La siguiente query especifica un ordenamiento del campo amount en orden descendente.
db.orders.find().sort( { amount: -1 } )
El query devuelve los siguientes documentos, en orden descendente de amount:
{ "_id" : 2, "item" : { "category" : "cookies", "type" : "chocolate chip" }, "amount" : 50 } { "_id" : 4, "item" : { "category" : "cake", "type" : "lemon" }, "amount" : 30 } { "_id" : 5, "item" : { "category" : "cake", "type" : "carrot" }, "amount" : 20 } { "_id" : 3, "item" : { "category" : "cookies", "type" : "chocolate chip" }, "amount" : 15 } { "_id" : 1, "item" : { "category" : "cake", "type" : "chiffon" }, "amount" : 10 } { "_id" : 6, "item" : { "category" : "brownies", "type" : "blondie" }, "amount" : 10 }
El siguiente query especifica el orden de clasificación utilizando los campos de un documento incrustado item. El query ordena primero por el campo category en orden ascendente y, a continuación, dentro de cada category, por el campo type en orden ascendente.
db.orders.find().sort( { "item.category": 1, "item.type": 1 } )
La query devuelve los siguientes documentos, ordenados primero por el campo category y, dentro de cada categoría, por el campo type:
{ "_id" : 6, "item" : { "category" : "brownies", "type" : "blondie" }, "amount" : 10 } { "_id" : 5, "item" : { "category" : "cake", "type" : "carrot" }, "amount" : 20 } { "_id" : 1, "item" : { "category" : "cake", "type" : "chiffon" }, "amount" : 10 } { "_id" : 4, "item" : { "category" : "cake", "type" : "lemon" }, "amount" : 30 } { "_id" : 2, "item" : { "category" : "cookies", "type" : "chocolate chip" }, "amount" : 50 } { "_id" : 3, "item" : { "category" : "cookies", "type" : "chocolate chip" }, "amount" : 15 }
Realiza la devolución en orden natural
El $natural parámetro devuelve elementos de acuerdo con su orden natural dentro de la base de datos. Este orden es una característica de implementación interna, y no debería depender de ningún orden particular de los documentos.
Uso del índice
Los queries que incluyen un orden por $natural clasificación no utilizan índices para cumplir con el predicado del query, con la siguiente excepción: si el predicado del query es una condición de igualdad en el campo _id { _id: <value> }, entonces el query con la clasificación por puede usar el índice $natural el _id.