Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

$sort (etapa de agregación)

$sort

Ordena todos los documentos de entrada y los devuelve al pipeline en orden.

Puedes usar $sort para implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente administrado para implementaciones de MongoDB en la nube.
  • 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.

$sort tiene la siguiente forma:

{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }

$sort toma un documento que especifica los campos por orden y el orden de clasificación respectivo. <sort order> puede tener uno de los siguientes valores:

Valor
Descripción

1

Ordenar de forma ascendente.

-1

Ordenar de forma descendente.

{ $meta: "textScore" }

Ordene por los metadatos textScore calculados en orden descendente. Para ver un ejemplo, consulte Ordenar metadatos de puntuación de texto.

Al ordenar por varios campos, $sort evalúa el orden de clasificación de izquierda a derecha. Los documentos se ordenan primero por <field1>, luego los documentos con el mismo valor de <field1> se ordenan por <field2>.

$sort es una etapa de bloqueo, que hace que el pipeline espere a que se recuperen todos los datos de entrada para la etapa de bloqueo antes del procesamiento de los datos. Una etapa de bloqueo puede reducir el rendimiento porque disminuye el procesamiento paralelo en un pipeline con múltiples etapas. Una etapa de bloqueo también puede utilizar cantidades sustanciales de memoria para grandes conjuntos de datos.

  • 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 colección movies en el conjunto de datos de muestra sample_mflix. El siguiente comando ordena las películas estrenadas en 1925 o 1926 por year en orden ascendente:

db.movies.aggregate( [
{ $match: { year: { $in: [ 1925, 1926 ] } } },
{ $sort: { year: 1 } },
{ $project: { _id: 0, title: 1, year: 1 } }
] )

Debido a que el campo year tiene valores duplicados para 1925 y 1926, los documentos con el mismo valor pueden ordenarse de forma diferente en distintas ejecuciones. Por ejemplo, dos ejecuciones del comando anterior producen ordenaciones diferentes:

[
{ title: "Clash of the Wolves", year: 1925 },
{ title: "Lady Windermere's Fan", year: 1925 },
{ title: "Grass: A Nation's Battle for Life", year: 1925 },
{ title: "Beau Geste", year: 1926 },
{ title: "The Black Pirate", year: 1926 },
{ title: "Ella Cinders", year: 1926 },
{ title: "For Heaven's Sake", year: 1926 },
{ title: "The Son of the Sheik", year: 1926 },
{ title: "The Strong Man", year: 1926 }
]
[
{ title: "Lady Windermere's Fan", year: 1925 },
{ title: "Grass: A Nation's Battle for Life", year: 1925 },
{ title: "Clash of the Wolves", year: 1925 },
{ title: "The Strong Man", year: 1926 },
{ title: "The Black Pirate", year: 1926 },
{ title: "Ella Cinders", year: 1926 },
{ title: "Beau Geste", year: 1926 },
{ title: "The Son of the Sheik", year: 1926 },
{ title: "For Heaven's Sake", year: 1926 }
]

Una operación ordena los valores de year en orden ascendente, pero el orden de los documentos que contienen valores duplicados para year no es el mismo. Por ejemplo, valores duplicados para 1925 y 1926.

Para lograr una clasificación coherente, agrega un campo que contenga solo valores únicos a la clasificación. El siguiente comando ordena tanto en el campo year como en el campo _id:

db.movies.aggregate( [
{ $match: { year: { $in: [ 1925, 1926 ] } } },
{ $sort: { year: 1, _id: 1 } }
] )

El campo _id siempre contiene valores únicos y el orden de clasificación es coherente para múltiples ejecuciones de clasificación.

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, considere estos documentos de la colección movies en el conjunto de datos de muestra sample_mflix:

{
_id: ObjectId("573a1395f29313caabce166c"),
title: "The Comancheros",
genres: [ "Action", "Western", "Adventure" ]
}
{
_id: ObjectId("573a1391f29313caabcd8521"),
title: "The Son of the Sheik",
genres: [ "Adventure", "Drama" ]
}

Las siguientes queries ordenan los documentos por el campo genres en orden ascendente y descendente:

// Ascending sort
db.movies.aggregate( [
{
$match: {
title: { $in: [
"The Comancheros", "The Son of the Sheik"
] }
}
},
{
$sort: { genres: 1 }
}
] )
// Descending sort
db.movies.aggregate( [
{
$match: {
title: { $in: [
"The Comancheros", "The Son of the Sheik"
] }
}
},
{
$sort: { genres: -1 }
}
] )

Ambas query anteriores devuelven The Comancheros primero porque Action y Western son las entradas más bajas y más altas en su arreglo genres, 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 películas cuyo arreglo genres incluye "Drama" o "Western" y ordena los resultados por genres en orden ascendente:

db.movies.aggregate( [
{
$match: {
title: { $in: [
"The Comancheros", "The Son of the Sheik"
] },
genres: { $in: [ "Drama", "Western" ] }
}
},
{
$sort: { genres: 1 }
}
] )

La ordenación es ascendente. La clave de ordenación es el primer valor en el arreglo genres cuando se ordena alfabéticamente:

  • En The Comancheros, el primer elemento genres es Action. Este valor se utiliza como clave de ordenación aunque no coincida con el filtro { genres: { $in: [ "Drama", "Western" ] } }.

  • En The Son of the Sheik, el primer elemento genres es Adventure. De manera similar, esta operación utiliza Adventure como clave de ordenación incluso si no coincide con el filtro.

La query devuelve The Comancheros 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:

Cuando un $sort precede a un $limit y no hay etapas intermedias que modifiquen el número de documentos, el optimizador puede fusionar el $limit en el $sort.Esto permite que la operación $sort mantenga solo los n mejores resultados a medida que avanza, donde n es el límite especificado, y garantiza que MongoDB solo necesite almacenar n elementos en memoria. Esta optimización sigue aplicándose cuando allowDiskUse es true y los n elementos superan el límite de memoria de agregación.

Las optimizaciones están sujetas a cambios entre versiones.

Las etapas de la pipeline que requieren más de 100 megabytes de memoria para ejecutarse escriben archivos temporales en el disco por defecto. Estos archivos temporales duran durante la ejecución del pipeline y pueden afectar el espacio de almacenamiento en tu instancia.

Los comandos individuales find y aggregate pueden anular el parámetro allowDiskUseByDefault de las siguientes maneras:

  • Se utiliza { allowDiskUse: true } para permitir la escritura de archivos temporales en el disco cuando allowDiskUseByDefault se establece en false

  • Se utiliza { allowDiskUse: false } para prohibir la escritura de archivos temporales en el disco cuando allowDiskUseByDefault esté configurado en true

Nota

Para MongoDB Atlas, se recomienda configurar el escalado automático del almacenamiento para evitar que las consultas de larga duración llenen el almacenamiento con archivos temporales.

Si su clúster de Atlas utiliza el escalado automático de almacenamiento, los archivos temporales pueden hacer que su clúster escale al siguiente nivel de almacenamiento.

Para obtener más información, consulte Límites de pipeline de agregación.

El operador $sort puede utilizar un índice cuando es la primera etapa de un pipeline o está precedido únicamente por una etapa $match.

Cuando utiliza el $sort en un clúster particionado, cada partición ordena sus documentos de resultado a través de un índice cuando esté disponible. Luego, el mongos o una de las particiones realiza un ordenamiento por fusión en flujo.

Los ejemplos de esta página utilizan datos del conjunto de datos sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en la implementación autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si realizó alguna modificación en las bases de datos de muestra, es posible que deba descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta página.

Para cada campo de ordenación, establezca el valor en 1 para orden ascendente o en -1 para orden descendente. Por ejemplo:

db.movies.aggregate(
[
{ $sort: { year: -1, title: 1 } },
{ $limit: 5 }
]
)

Esta operación ordena los documentos en la colección movies de forma descendente por year, y luego de forma ascendente por title, y devuelve los cinco primeros resultados.

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 funcionalidades de consulta de texto para implementaciones autogestionadas (sin Atlas). Para datos alojados en MongoDB, MongoDB también ofrece una solución mejorada de consulta de texto completo: MongoDB Search.

El siguiente ejemplo utiliza la colección movies del conjunto de datos de muestra sample_mflix. Antes de ejecutarlo, cree un índice de texto en el campo plot:

db.movies.createIndex( { plot: "text" } )

Para un pipeline que incluye $text, puede ordenar por puntuación de relevancia descendente mediante la expresión { $meta: "textScore" }. En el documento { <sort-key> }, establezca la expresión { $meta: "textScore" } en un nombre de campo arbitrario. El sistema de query ignora el nombre del campo. Por ejemplo:

db.movies.aggregate(
[
{ $match: { $text: { $search: "pirate" } } },
{ $sort: { score: { $meta: "textScore" }, year: -1 } },
{ $limit: 5 }
]
)

Esta operación coincide con documentos con $text, luego los ordena de forma descendente por los metadatos "textScore" y por year, y devuelve los cinco primeros resultados. El sistema de query ignora el nombre del campo score en el documento de ordenación. La proyección no incluye los metadatos "textScore" y no devuelve los metadatos como parte de los documentos coincidentes. Consulte $meta para obtener más información.

Para ver ejemplos completos de agregación que utilizan $sort, consulte los Tutoriales completos de la pipeline de agregación.