Docs Menu
Docs Home
/ /
Etapas de la pipeline de agregación

$sortByCount (agregación)

$sortByCount

Nuevo 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", 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

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 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:

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

Volver

$sort

En esta página