Docs Menu
Docs Home
/ /

cursor.sort() (método de mongosh)

cursor.sort(sort)

Importante

Método mongosh

Esta página documenta una mongosh Mé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.

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.

El método sort() tiene el siguiente parámetro:

Parameter
Tipo
Descripción

sort

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.

  • Puedes ordenar sobre un máximo de 32 claves.

  • Proveer un patrón de ordenación con campos duplicados causa un error.

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.

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:

  1. MinKey (tipo interno)

  2. Nulo

  3. Números (enteros, largos, dobles, decimales)

  4. Símbolo, string

  5. Objeto

  6. Arreglo

  7. BinData

  8. ObjectId

  9. Booleano

  10. fecha

  11. Marca de tiempo

  12. Expresión regular

  13. Código JavaScript

  14. Código JavaScript con alcance

  15. 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.

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.

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.

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 elemento sizes de menor valor es 7. Este valor se utiliza como clave de ordenación aunque no coincida con el filtro { sizes: { $gt: 9 }.

  • En el documento _id: 'B', el elemento sizes de menor valor es 8. 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:

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:

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().

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.

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 }

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

Antes de MongoDB 7.0, $natural acepta valores de tipo incorrectos, tales como 0, NaN, "X" y -0.01. Después de MongoDB 7.0, si pasas cualquier valor que no sea 1 y -1 a $natural, MongoDB devuelve un error.

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.

Volver

cursor.skip

En esta página