Definición
$sortByCountNuevo 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 están ordenados 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 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,employeeespecifique"$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
employeelosbusinesscampos y son campos de documento, la siguiente$mergeObjectsexpresión, que da como resultado un documento, es un argumento válido$sortByCountpara:{ $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" } }
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 es $sortByCount $group $sort equivalente a la siguiente secuencia +:
{ $group: { _id: <expression>, count: { $sum: 1 } } }, { $sort: { count: -1 } }
Ejemplo
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 }