$sortByCount(集計)
定義
$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" } }
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
コレクションを考えてみましょう。
{ "_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 }