Docs Menu
Docs Home
/ /

$sortByCount (etapa de agregación)

$sortByCount

Agrupa los documentos entrantes según el valor de una expresión especificada y luego calcula el número de documentos en cada grupo distinto.

Cada documento de salida contiene dos campos: un campo _id que contiene el valor de agrupación distinto y un campo count que contiene el número de documentos que pertenecen a esa agrupación o categoría.

Los documentos están ordenados por count en orden descendente.

El $sortByCount El escenario tiene la siguiente forma de prototipo:

{ $sortByCount: <expression> }
Campo
Descripción

expression

Expresión por la que agrupar. Puedes especificar cualquier expresión, excepto un literal de documento.

Para especificar la ruta de un campo, anteponga el signo de dólar al nombre del campo $ y escríbalo entre comillas. Por ejemplo, para agrupar por el campo,employee especifique "$employee" como expresión.

{ $sortByCount: "$employee" }

Aunque no se puede especificar un literal de documento para la expresión "group by", sí se puede especificar un campo o una expresión que dé como resultado un documento. Por ejemplo, si employee los business campos y son campos de documento, la siguiente $mergeObjects expresión, que da como resultado un documento, es un argumento válido $sortByCount para:

{ $sortByCount: { $mergeObjects: [ "$employee", "$business" ] } }

Sin embargo, el siguiente ejemplo con la expresión literal del documento no es válido:

{ $sortByCount: { lname: "$employee.last", fname: "$employee.first" } }

Tip

A partir de MongoDB 6.0, las etapas de la canalización que requieren más de 100 megabytes de memoria para ejecutarse escriben archivos temporales en el disco de forma predeterminada. Estos archivos temporales duran mientras se ejecuta la canalización y pueden afectar el espacio de almacenamiento de la instancia. En versiones anteriores de MongoDB, se debía pasar { allowDiskUse: true } a los comandos find y aggregate para habilitar este comportamiento.

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.

La etapa es $sortByCount $group $sort equivalente a la siguiente secuencia +:

{ $group: { _id: <expression>, count: { $sum: 1 } } },
{ $sort: { count: -1 } }

Considere una colección exhibits con los siguientes documentos:

db.exhibits.insertMany(
[
{ _id: 1, title: "The Pillars of Society", artist: "Grosz", year: 1926, tags: [ "painting", "satire", "Expressionism", "caricature" ] },
{ _id: 2, title: "Melancholy III", artist: "Munch", year: 1902, tags: [ "woodcut", "Expressionism" ] },
{ _id: 3, title: "Dancer", artist: "Miro", year: 1925, tags: [ "oil", "Surrealism", "painting" ] },
{ _id: 4, title: "The Great Wave off Kanagawa", artist: "Hokusai", tags: [ "woodblock", "ukiyo-e" ] },
{ _id: 5, title: "The Persistence of Memory", artist: "Dali", year: 1931, tags: [ "Surrealism", "painting", "oil" ] },
{ _id: 6, title: "Composition VII", artist: "Kandinsky", year: 1913, tags: [ "oil", "painting", "abstract" ] },
{ _id: 7, title: "The Scream", artist: "Munch", year: 1893, tags: [ "Expressionism", "painting", "oil" ] },
{ _id: 8, title: "Blue Flower", artist: "O'Keefe", year: 1918, tags: [ "abstract", "painting" ] }
]
)

La siguiente operación unwinds la tags matriz y utiliza la etapa para contar la cantidad de documentos asociados con cada $sortByCount etiqueta:

db.exhibits.aggregate( [ { $unwind: "$tags" }, { $sortByCount: "$tags" } ] )

La operación devuelve los siguientes documentos, ordenados en orden descendente por conteo:

[
{ _id: "painting", count: 6 },
{ _id: "oil", count: 4 },
{ _id: "Expressionism", count: 3 },
{ _id: "Surrealism", count: 2 },
{ _id: "abstract", count: 2 },
{ _id: "woodblock", count: 1 },
{ _id: "woodcut", count: 1 },
{ _id: "ukiyo-e", count: 1 },
{ _id: "satire", count: 1 },
{ _id: "caricature", count: 1 }
]

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:

public class Movie
{
public ObjectId Id { get; set; }
public int Runtime { get; set; }
public string Title { get; set; }
public string Rated { get; set; }
public List<string> Genres { get; set; }
public string Plot { get; set; }
public ImdbData Imdb { get; set; }
public int Year { get; set; }
public int Index { get; set; }
public string[] Comments { get; set; }
[BsonElement("lastupdated")]
public DateTime LastUpdated { get; set; }
}

Nota

ConventionPack para Pascal Case

Las clases de C# en esta página utilizan Pascal case para los nombres de sus propiedades, pero los nombres de los campos en la colección de MongoDB utilizan camel case. Para tener en cuenta esta diferencia, se puede usar el siguiente código para registrar un ConventionPack cuando la aplicación se inicie:

var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);

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

El siguiente ejemplo crea una etapa de canalización que agrupa los documentos entrantes Movie por el valor de su campo Rated y luego devuelve la cantidad de documentos en cada grupo:

var pipeline = new EmptyPipelineDefinition<Movie>()
.SortByCount(m => m.Rated);

Los ejemplos de Node.js 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, consulte Primeros pasos en la documentación del controlador de MongoDB Node.js.

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

El siguiente ejemplo crea una etapa de pipeline que agrupa los documentos de entrada de movie por el valor de su campo rated, y luego devuelve el número de documentos en cada grupo. A continuación, el ejemplo ejecuta la pipeline de agregación:

const pipeline = [{ $sortByCount: "$rated" }];
const cursor = collection.aggregate(pipeline);
return cursor;

Volver

$sort

En esta página