$sortByCount (agregação)
Nesta página
Definição
$sortByCount
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 o seguinte formato 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 os campos
employee
ebusiness
forem campos de documento, a seguinte expressão$mergeObjects
, que avalia para um documento, é 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" } } Dica
Veja também:
Considerações
$sortByCount
e restrições de memória
$sortByCount
está sujeito ao limite de uso de memória de 100 megabytes, mas é capaz de escrever arquivos temporários no disco se for necessário espaço adicional.
A partir do MongoDB 6.0, estágios de pipeline que exigem mais de 100 megabytes de memória para executar arquivos temporários de gravação em disco por padrão. Em versões anteriores do MongoDB, você deve passar { allowDiskUse: true }
para find
individuais e comandos aggregate
para habilitar esse comportamento.
Somente find
e aggregate
comandos podem substituir o parâmetro allowDiskUseByDefault
por um ou outro:
Usando
{ allowDiskUse: true }
para permitir a gravação de arquivos temporários no disco quandoallowDiskUseByDefault
estiver definido comofalse
Usando
{ allowDiskUse: false }
para proibir a gravação de arquivos temporários no disco quandoallowDiskUseByDefault
estiver definido comotrue
Dica
Veja também:
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 unwinds
a array tags
e usa o estágio $sortByCount
para contar o número de documentos associados a cada marcação:
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 }