Definição
$sortByCountAgrupa 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
_idcontendo o valor de agrupamento distinto e um campocountcontendo o número de documentos pertencentes a esse agrupamento ou categoria.Os documentos são ordenados por
countem ordem decrescente.O estágio
$sortByCounttem a seguinte forma de protótipo:{ $sortByCount: <expression> } CampoDescriçãoexpressionAgrupamento 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
employeeosbusinesscampos e forem campos de documento , a seguinte$mergeObjectsexpressão , que avalia para um documento, será um argumento válido$sortByCountpara:{ $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
$sortByCount e restrições de memória
Estágios de pipeline que exigem mais de 100 megabytes de memória para executar, gravam arquivos temporários em disco por padrão. Esses arquivos temporários duram durante a execução do pipeline e podem influenciar o espaço de armazenamento em sua instância.
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 quandoallowDiskUseByDefaultestiver definido comofalseUsando
{ allowDiskUse: false }para proibir a gravação de arquivos temporários no disco quandoallowDiskUseByDefaultestiver definido comotrue
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.
Comportamento
O estágio $sortByCount é equivalente à seguinte sequência $group + $sort:
{ $group: { _id: <expression>, count: { $sum: 1 } } }, { $sort: { count: -1 } }
Exemplos
Considere uma coleção exhibits com os seguintes documentos:
db.exhibits.insertMany( [ { _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 } ]
Os exemplos de C# nesta página utilizam o banco de dados sample_mflix a partir dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de exemplo, consulte Introdução na documentação do driver MongoDB .NET/C#.
A seguinte classe Movie modela os documentos na collection sample_mflix.movies:
[] public class Movie { [] public ObjectId Id { get; set; } [] public string Title { get; set; } = null!; [] public int? Year { get; set; } [] public int? Runtime { get; set; } [] public string? Rated { get; set; } [] public int Metacritic { get; set; } [] public string? Plot { get; set; } [] public string? Type { get; set; } [] public string[]? Cast { get; set; } [] public string[]? Directors { get; set; } [] public string[]? Writers { get; set; } [] public ImdbData? Imdb { get; set; } }
Para usar o driver MongoDB .NET/C# para adicionar um estágio $sortByCount a um pipeline de agregação, chame o método SortByCount() em um objeto PipelineDefinition.
O exemplo a seguir cria um estágio de pipeline que agrupa os Movie documentos recebidos pelo valor de seu campo Rated e, em seguida, retorna o número de documentos em cada grupo:
var pipeline = new EmptyPipelineDefinition<Movie>() .SortByCount(m => m.Rated);
{ "_id" : "...", "count" : 9894 } { "_id" : "R", "count" : 5537 } { "_id" : "PG-13", "count" : 2321 } { "_id" : "PG", "count" : 1852 } { "_id" : "APPROVED", "count" : 709 } { "_id" : "G", "count" : 477 } { "_id" : "PASSED", "count" : 181 } { "_id" : "TV-14", "count" : 89 } { "_id" : "TV-PG", "count" : 76 } { "_id" : "TV-MA", "count" : 60 } { "_id" : "TV-G", "count" : 59 } { "_id" : "GP", "count" : 44 } { "_id" : "M", "count" : 37 } { "_id" : "Approved", "count" : 5 } { "_id" : "AO", "count" : 3 } { "_id" : "TV-Y7", "count" : 3 } { "_id" : "OPEN", "count" : 1 } { "_id" : "Not Rated", "count" : 1 }
Os exemplos do Node.js nesta página utilizam o banco de dados do sample_mflix a partir dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster gratuito do MongoDB Atlas e carregar os conjuntos de dados de exemplo, consulte Introdução na documentação do driver do MongoDB Node.js
Para usar o driver Node.js do MongoDB para adicionar um estágio $sortByCount a um pipeline de agregação , use o operador $sortByCount em um objeto de pipeline.
O exemplo a seguir cria uma etapa de pipeline que agrupa os documentos de entrada movie pelo valor do campo rated e, em seguida, retorna a quantidade de documentos em cada grupo. O exemplo em seguida executa o pipeline de agregação:
const pipeline = [{ $sortByCount: "$rated" }]; const cursor = collection.aggregate(pipeline); return cursor;