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 gestionado 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 los que ordenar y su orden de clasificación. <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>, y 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.

Consideremos 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 manera 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 ordenación consistente, agregue un campo que contenga solo valores únicos a la ordenación. El siguiente comando ordena tanto por el campo year como por 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 consistente 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 consultas anteriores devuelven The Comancheros primero porque Action y Western son las entradas más baja y más alta en su matriz 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 consulta encuentra películas cuyo array 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 del array 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 coincide 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 aunque no coincida con el filtro.

La consulta 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 con el $sort. Esto permite que la operación de $sort solo mantenga 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 elementos de n 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 de almacenamiento para evitar que los queries 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 usar un índice cuando es la primera etapa en una tubería o está precedido únicamente por una etapa$match.

Cuando se utiliza $sort en un clúster fragmentado, cada fragmento ordena sus documentos de resultado utilizando un índice, si está disponible. A continuación,mongos o uno de los fragmentos realiza una ordenación por fusión en flujo.

Los ejemplos de esta página utilizan datos del conjunto de datos de muestra 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 se realizó alguna modificación en las bases de datos de muestra, es posible que se deban 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 -1 para orden descendente. Por ejemplo:

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

Esta operación ordena los documentos de la colección movies de forma descendente según year, luego de forma ascendente según 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 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.

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 compara los documentos con $text, los ordena de forma descendente según los metadatos "textScore" y year, y devuelve los cinco primeros resultados. El sistema de consulta ignora el nombre del campo score en el documento de ordenación. La proyección no incluye los metadatos "textScore" ni los devuelve como parte de los documentos coincidentes. Consulte $meta para obtener más información.

Los ejemplos de C# en esta página utilizan la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta Primeros pasos en la documentación del controlador de MongoDB .NET/C#.

La siguiente clase Movie modela los documentos en la colección sample_mflix.movies:

[BsonIgnoreExtraElements]
public class Movie
{
[BsonId]
public ObjectId Id { get; set; }
[BsonElement("title")]
public string Title { get; set; } = null!;
[BsonElement("year")]
public int? Year { get; set; }
[BsonElement("runtime")]
public int? Runtime { get; set; }
[BsonElement("rated")]
public string? Rated { get; set; }
[BsonElement("metacritic")]
public int Metacritic { get; set; }
[BsonElement("plot")]
public string? Plot { get; set; }
[BsonElement("type")]
public string? Type { get; set; }
[BsonElement("cast")]
public string[]? Cast { get; set; }
[BsonElement("directors")]
public string[]? Directors { get; set; }
[BsonElement("writers")]
public string[]? Writers { get; set; }
[BsonElement("imdb")]
public ImdbData? Imdb { get; set; }
}

Para usar el controlador MongoDB.NET/C# para agregar una $sort etapa a una canalización de agregación, llame al método UnionWith() en un PipelineDefinition objeto.

El siguiente ejemplo crea una etapa de la pipeline que primero filtra Movie documentos en los que Metacritic es igual a 100, y luego ordena los resultados en orden descendente por el campo Year y en orden ascendente por el campo Title:

var pipeline = new EmptyPipelineDefinition<Movie>()
.Match(Builders<Movie>.Filter.Eq(m => m.Metacritic, 100))
.Sort(Builders<Movie>.Sort.Combine(
Builders<Movie>.Sort.Descending(m => m.Year),
Builders<Movie>.Sort.Ascending(m => m.Title)));

Para utilizar el controlador de MongoDB Node.js para agregar una etapa de $sort a una canalización de agregación, utilice el Operador $sort en un objeto de canalización.

En el siguiente ejemplo, se crea una etapa de pipeline que ordena los documentos de la entrada movie, primero en orden descendente según el campo year y luego en orden ascendente según el campo title. A continuación, se ejecuta el pipeline de agregación:

const pipeline = [{ $sort: { year: -1, title: 1 } }];
const cursor = collection.aggregate(pipeline);
return cursor;

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