Definición
$sortByCountNovedad 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
_idque contiene el valor de agrupación distinto y un campocountque contiene el número de documentos que pertenecen a esa agrupación o categoría.Los documentos se ordenan por
counten orden descendente.La etapa
$sortByCounttiene la siguiente forma de prototipo:{ $sortByCount: <expression> } CampoDescripciónexpressionExpresió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 campoemployee, 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
employeeybusinessson 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" } }
Considerations
$count y restricciones de memoria
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.
Comportamiento
La etapa $sortByCount es equivalente a la siguiente secuencia $group + $sort :
{ $group: { _id: <expression>, count: { $sum: 1 } } }, { $sort: { count: -1 } }
Ejemplo
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 }