Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

$sortByCount(集計)

項目一覧

  • 定義
  • Considerations
  • 動作
$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

以下も参照してください。

MongoDB 6.0 以降、 100 MB 以上のメモリを必要とするパイプライン ステージでは、デフォルトで一時ファイルをディスクに書き込みます。これらの一時ファイルはパイプラインの実行中ずっと残り、インスタンスのストレージ容量に影響を与える可能性があります。以前のバージョンの MongoDB では、この動作を有効にするには、個々の find コマンドと aggregate コマンドに { allowDiskUse: true } を渡す必要がありました。

個々の findaggregate コマンドは、次のいずれかの方法で allowDiskUseByDefault パラメーターを上書きできます。

  • allowDiskUseByDefaultfalse に設定されている場合に { allowDiskUse: true } を使用して一時ファイルをディスクに書き込むことを許可する

  • allowDiskUseByDefaulttrue に設定されている場合に { 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 }

戻る

$sort