Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
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 están ordenados 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 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 (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 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 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