Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /
Etapas de la pipeline de agregación

$sortByCount (agregación)

$sortByCount

Novedad en la versión 3.4.

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 se ordenan por count en orden descendente.

La etapa $sortByCount 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 una ruta de campo, anteponga el nombre del campo con un signo de dólar $ y enciérrelo entre comillas. Por ejemplo, para agrupar por el campo employee, especifique "$employee" como la expresión.

{ $sortByCount: "$employee" }

Aunque no se puede especificar un literal de documento para la expresión group by (agrupación), sí se puede, en cambio, especificar un campo o expresión que evalúe como un documento. Por ejemplo, si los campos employee y business son campos de documentos, entonces la siguiente expresión $mergeObjects, que evalúa como un documento, es un argumento válido para $sortByCount:

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

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

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

Tip

La etapa $sortByCount tiene un límite de 100 megabytes de RAM. Por defecto, si la etapa supera este límite, $sortByCount devuelve un error. Para permitir más espacio para el procesamiento por etapas, utiliza la opción allowDiskUse para activar que las etapas del pipeline de agregación guarden datos en archivos temporales.

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

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

Considera una colección exhibits con los siguientes documentos:

{ "_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 el tags arreglo y utiliza la etapa $sortByCount para contar el número de documentos asociados a cada etiqueta:

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

La operación retorna los siguientes documentos, ordenados en orden descendente por recuento:

{ "_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 }

Volver

$sort

En esta página