$sortByCount (agregação)
Nesta página
Definição
$sortByCount
Novidade na versão 3.4.
Agrupa documentos recebidos com base no valor de uma expressão especificada e, em seguida, calcula a contagem de documentos em cada grupo distinto.
Cada documento de saída contém dois campos: um campo
_id
contendo o valor de agrupamento distinto e um campocount
contendo o número de documentos pertencentes a esse agrupamento ou categoria.Os documentos são ordenados por
count
em ordem decrescente.O estágio
$sortByCount
tem a seguinte forma de protótipo:{ $sortByCount: <expression> } CampoDescriçãoexpression
Agrupamento por expressão. Você pode especificar qualquer expressão, exceto um literal de documento.
Para especificar um caminho do campo, prefixe o nome do campo com um cifrão
$
e coloque-o entre aspas. Por exemplo, para agrupar pelo campoemployee
, especifique"$employee"
como a expressão.{ $sortByCount: "$employee" } Embora não seja possível especificar um literal de documento para a agrupar por expressão, você pode, no entanto, especificar um campo ou uma expressão que seja avaliado como um documento. Por exemplo, se
employee
osbusiness
campos e forem campos de documento , a seguinte$mergeObjects
expressão , que avalia para um documento, será um argumento válido para$sortByCount
:{ $sortByCount: { $mergeObjects: [ "$employee", "$business" ] } } No entanto, o exemplo a seguir com a expressão literal de documento é inválido:
{ $sortByCount: { lname: "$employee.last", fname: "$employee.first" } }
Considerações
$count
e restrições de memória
O estágio $sortByCount
tem um limite de 100 megabytes de RAM. Por padrão, se o estágio exceder este limite, $sortByCount
retornará um erro. Para permitir mais espaço para o processamento do estágio, use a opção allowDiskUse para permitir que os estágios do pipeline de agregação gravem dados em arquivos temporários.
Comportamento
O estágio $sortByCount
é equivalente à seguinte sequência $group
+ $sort
:
{ $group: { _id: <expression>, count: { $sum: 1 } } }, { $sort: { count: -1 } }
Exemplo
Considere uma coleção exhibits
com os seguintes 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" ] }
A operação a seguir aplica o comando unwinds
na array tags
e usa o estágio $sortByCount
para contar o número de documentos associados a cada tag:
db.exhibits.aggregate( [ { $unwind: "$tags" }, { $sortByCount: "$tags" } ] )
A operação retorna os seguintes documentos, ordenados em ordem decrescente por contagem:
{ "_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 }