定義
- $sortByCount
- 指定された式の値に基づいて受信ドキュメントをグループ化し、個別のグループごとにドキュメントの数を計算します。 - 各出力ドキュメントには 2 つのフィールドがあります。1 つは個別のグループ値を含む - _idフィールドで、もう 1 つはそのグループまたはカテゴリに属するドキュメントの数を含む- countフィールドです。- ドキュメントは - countの降順にソートされます。- $sortByCountステージのプロトタイプ形式は次のとおりです。- { $sortByCount: <expression> } フィールド説明- expression- グループ化するための式です。ドキュメント リテラル以外の任意の式を指定できます。 - フィールド パスを指定するには、フィールド名の前にドル記号 - $を付け、引用符で囲みます。たとえば、フィールド- employeeでグループ化するには、式として- "$employee"を指定します。- { $sortByCount: "$employee" } - グループ式ための式 にドキュメントリテラルを指定することはできませんが、ドキュメントを評価するフィールドまたは式を指定できます。 例、 フィールドと フィールドがドキュメントフィールドであれば、次のドキュメントとして評価される - employee- business- $mergeObjects式は、- $sortByCountの有効な引数になります。- { $sortByCount: { $mergeObjects: [ "$employee", "$business" ] } } - ただし、ドキュメントリテラル式を含む次の例は無効です。 - { $sortByCount: { lname: "$employee.last", fname: "$employee.first" } } - Tip
Considerations
$sortByCount およびメモリ制限
MongoDB 6.0 以降、 100 MB 以上のメモリを必要とするパイプライン ステージでは、デフォルトで一時ファイルをディスクに書き込みます。これらの一時ファイルはパイプラインの実行中ずっと残り、インスタンスのストレージ容量に影響を与える可能性があります。以前のバージョンの MongoDB では、この動作を有効にするには、個々の find コマンドと aggregate コマンドに { allowDiskUse: true } を渡す必要がありました。
個々の find と aggregate コマンドは、次のいずれかの方法で allowDiskUseByDefault パラメーターを上書きできます。
- allowDiskUseByDefaultが- falseに設定されている場合に- { allowDiskUse: true }を使用して一時ファイルをディスクに書き込むことを許可する
- allowDiskUseByDefaultが- trueに設定されている場合に- { allowDiskUse: false }を使用して一時ファイルがディスクに書き込むことを禁止する
注意
MongoDB Atlas でストレージが長時間実行クエリにより一時ファイルで満杯にするのを防ぐために、ストレージのオートスケーリングを構成することを推奨します。
Atlas クラスターでストレージのオートスケーリングが使用されている場合、一時ファイルによってクラスターが 1 つ上のストレージ階層にスケーリングされる場合があります。
詳しくは、「集計パイプラインの制限」を参照してください。
動作
$sortByCountステージは、次の$group + $sortシーケンスと同等です。
{ $group: { _id: <expression>, count: { $sum: 1 } } }, { $sort: { count: -1 } } 
例
以下のドキュメントを持つ exhibits コレクションを考えてみましょう。
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" ] }    ] ) 
次の操作では、tags 配列を unwinds し、$sortByCount ステージを使用して各タグに関連付けられているドキュメントの数がカウントされます。
db.exhibits.aggregate( [ { $unwind: "$tags" },  { $sortByCount: "$tags" } ] ) 
この操作では、カウントの降順で並べ替えられた次のドキュメントが返されます。
[    { _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 } ] 
このページのC#の例では、Atlasサンプルデータセット の sample_mflixデータベースを使用します。MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 MongoDB .NET/ C#ドライバーのドキュメントの「 開始 」を参照してください。
次の Movie クラスは、sample_mflix.movies コレクション内のドキュメントをモデル化します。
public class Movie {     public ObjectId Id { get; set; }     public int Runtime { get; set; }          public string Title { get; set; }     public string Rated { get; set; }     public List<string> Genres { get; set; }     public string Plot { get; set; }          public ImdbData Imdb { get; set; }     public int Year { get; set; }     public int Index { get; set; }          public string[] Comments { get; set; }         []     public DateTime LastUpdated { get; set; } } 
注意
パスカルケースの ConventionPack
このページのC# クラスはプロパティ名にパスカルケースを使用していますが、MongoDB コレクションのフィールド名はキャメルケースを使用しています。この違いを考慮するために、アプリケーションが起動する際に次のコードを使用してConventionPackを登録してください。
var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 
MongoDB .NET/ C#ドライバーを使用して$sortByCount ステージを集計パイプラインに追加するには、 PipelineDefinitionオブジェクトで SortByCount() メソッドを呼び出します。
次の例では、受信した Movie ドキュメントを Ratedフィールドの値でグループ化し、各グループのドキュメント数を返すパイプラインステージを作成します。
var pipeline = new EmptyPipelineDefinition<Movie>()     .SortByCount(m => m.Rated); 
このページのNode.js の例では、Atlasサンプルデータセット の sample_mflixデータベースを使用します。無料のMongoDB Atlas cluster を作成し、サンプルデータセットをロードする方法については、 MongoDB Node.jsドライバーのドキュメントの開始を参照してください。
MongoDB Node.jsドライバーを使用して $sortByCount ステージを集計パイプラインに追加するには、パイプラインオブジェクトで $sortByCount 演算子を使用します。
次の例では、受信した movie ドキュメントを rated フィールドの値でグループ化し、各グループのドキュメント数を返すパイプラインステージを作成します。次に、この例は集計パイプラインを実行します。
const pipeline = [{ $sortByCount: "$rated" }]; const cursor = collection.aggregate(pipeline); return cursor;