Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

$sortByCount (agregação)

Nesta página

  • Definição
  • Considerações
  • Comportamento
  • Exemplo
$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 campo count 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> }
Campo
Descrição
expression

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 campo employee, 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 e business 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:

A partir do MongoDB 6.0, os estágios do pipeline que exigem mais de 100 megabytes de memória para execução gravam arquivos temporários no disco por padrão. Esses arquivos temporários duram durante a execução do pipeline e podem influenciar o espaço de armazenamento na sua instância. 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 quando allowDiskUseByDefault estiver definido como false

  • Usando { allowDiskUse: false } para proibir a gravação de arquivos temporários no disco quando allowDiskUseByDefault estiver definido como true

Observação

Para o MongoDB Atlas, é recomendável configurar o auto-scaling de armazenamento para evitar que queries de longa duração preencham o armazenamento com arquivos temporários.

Se o Atlas cluster usar auto-scaling de armazenamento, os arquivos temporários podem fazer com que o cluster seja dimensionado para o próximo nível de armazenamento.

Para obter mais detalhes, consulte Limites do pipeline de agregação.

O estágio $sortByCount é equivalente à seguinte sequência $group + $sort:

{ $group: { _id: <expression>, count: { $sum: 1 } } },
{ $sort: { count: -1 } }

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 }

Voltar

$sort