Docs Menu
Docs Home
/ /
Cursors

cursor.sort()

cursor.sort(sort)

Importante

Método mongosh

Este es un método.mongosh Esta no es la documentación de Node.js ni 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 losmongosh heredados. mongo Métodos de shell. Sin embargo, algunos métodos heredados no están disponibles mongosh en.

Para obtener la documentación del shell heredado, consulte la documentación de la versión correspondiente de MongoDB mongo Server:

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.

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.

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.

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

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.

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:

Tip

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 un conjunto de resultados se ordena y proyecta, el motor de consulta MongoDB siempre aplicará primero la ordenación.

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 }

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.

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