Definición
cursor.sort(sort)Importante
Método mongosh
Esta página documenta una
mongoshMétodo. Esta no es la documentación de un controlador específico del lenguaje, como Node.js.Para los drivers de API de MongoDB, consulte la documentación del driver de MongoDB específica del 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.
La operación $sort no es un "ordenamiento estable", lo que significa que no se garantiza que los documentos con claves de ordenamiento equivalentes permanezcan en el mismo orden relativo en la salida y en la entrada.
Si el campo especificado en los criterios de ordenación no existe en dos documentos, entonces el valor por el cual se ordenan es el mismo. Los dos documentos 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.
Importante
Al ordenar por campos inexistentes, MongoDB no garantiza un orden de salida específico. El comportamiento en estos casos puede cambiar de una versión a otra.
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
Código JavaScript con alcance
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 capacidades de query de texto para implementaciones autogestionadas (que no sean de Atlas). Para los datos alojados en MongoDB, MongoDB también ofrece una solución mejorada de query de texto completo, MongoDB 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.
Filtrar y ordenar por un campo de arreglo
Cuando filtra y ordena por un campo que contiene un arreglo, el filtro no afecta el valor utilizado como clave de ordenación. La ordenación siempre considera todos los valores del arreglo como posibles llaves de ordenación.
Por ejemplo, la siguiente query busca zapatos con tallas mayores a 9 y ordena los resultados por talla en orden ascendente:
db.shoes.find( { sizes: { $gt: 9 } } ).sort( { sizes: 1 } )
El orden es ascendente, lo que significa que la clave de ordenación es el valor más bajo en el arreglo sizes:
En el documento
_id: 'A', el elementosizesde menor valor es7. Este valor se utiliza como clave de ordenación aunque no coincida con el filtro{ sizes: { $gt: 9 }.En el documento
_id: 'B', el elementosizesde menor valor es8. De manera similar, este valor se utiliza como clave de ordenación incluso si no coincide con el filtro.
La query devuelve el documento con _id: 'A' primero.
Tip
Ordenar solo por valores coincidentes
Para considerar únicamente los valores coincidentes como posibles claves de ordenación, puedes generar un nuevo campo que contenga dichos valores y ordenar por ese campo. Para obtener más información, consulta estas etapas y expresiones del pipeline:
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 utilizar un índice o índices para obtener el orden de clasificación, MongoDB debe realizar una operación de clasificación en memoria sobre los datos.
Las operaciones de ordenación que utilizan un índice a menudo tienen un mejor rendimiento que las ordenaciones en memoria. Para obtener más información sobre cómo crear índices para brindar soporte a las operaciones de ordenación, consulte Usar índices para ordenar los resultados del query.
Para verificar si MongoDB debe realizar una ordenación en memoria, agrega cursor.explain() al query y revisa los resultados de la explicación. Si el plan del query contiene una etapa SORT, entonces MongoDB debe realizar una operación de ordenación en memoria.
Para evitar que las ordenaciones en memoria 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 una operación ordena proyecto con los mismos campos, MongoDB ordena según los valores originales de los campos antes de aplicar la proyección.
Ejemplos
Una colección orders contiene los siguientes documentos:
db.orders.insertMany( [ { _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.
Nota
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.