MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBの集計(Aggregation)でソートを実行する方法:$sort演算子の使い方を解説

MongoDBの集計(Aggregation)でソートを実行する方法

MongoDBで集計結果を並べ替えたい場合は、aggregate()メソッド$sort演算子を組み合わせて使用します。この記事では、実際にサンプルコレクションを作成しながら、集計パイプラインでデータを降順・昇順にソートする具体的な手順を解説します。

ステップ1:サンプルコレクションの作成

まず、動作を確認するためにドキュメントを格納したコレクションを作成します。以下のクエリで「aggregationSortDemo」コレクションに学生データを挿入していきます。

> db.aggregationSortDemo.insertOne({"StudentId":98,"StudentFirstName":"John","StudentLastName":"Smith"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c90140c5705caea966c5587")
}
> db.aggregationSortDemo.insertOne({"StudentId":128,"StudentFirstName":"Carol","StudentLastName":"Taylor"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c90141b5705caea966c5588")
}
> db.aggregationSortDemo.insertOne({"StudentId":110,"StudentFirstName":"David","StudentLastName":"Miller"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c90142f5705caea966c5589")
}
> db.aggregationSortDemo.insertOne({"StudentId":139,"StudentFirstName":"Chris","StudentLastName":"Brown"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c90146a5705caea966c558a")
}
> db.aggregationSortDemo.insertOne({"StudentId":125,"StudentFirstName":"Sam","StudentLastName":"Williams"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c9015695705caea966c558b")
}
> db.aggregationSortDemo.insertOne({"StudentId":139,"StudentFirstName":"Mike","StudentLastName":"Wilson"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c90158e5705caea966c558c")
}

ステップ2:登録済みドキュメントの確認

find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。クエリは次の通りです。

> db.aggregationSortDemo.find().pretty();

出力結果は以下の通りです。

{
   "_id" : ObjectId("5c90140c5705caea966c5587"),
   "StudentId" : 98,
   "StudentFirstName" : "John",
   "StudentLastName" : "Smith"
}
{
   "_id" : ObjectId("5c90141b5705caea966c5588"),
   "StudentId" : 128,
   "StudentFirstName" : "Carol",
   "StudentLastName" : "Taylor"
}
{
   "_id" : ObjectId("5c90142f5705caea966c5589"),
   "StudentId" : 110,
   "StudentFirstName" : "David",
   "StudentLastName" : "Miller"
}
{
   "_id" : ObjectId("5c90146a5705caea966c558a"),
   "StudentId" : 139,
   "StudentFirstName" : "Chris",
   "StudentLastName" : "Brown"
}
{
   "_id" : ObjectId("5c9015695705caea966c558b"),
   "StudentId" : 125,
   "StudentFirstName" : "Sam",
   "StudentLastName" : "Williams"
}
{
   "_id" : ObjectId("5c90158e5705caea966c558c"),
   "StudentId" : 139,
   "StudentFirstName" : "Mike",
   "StudentLastName" : "Wilson"
}

ステップ3:集計ソートの実行

ここからが本題となる集計ソートです。まず$groupステージでStudentIdごとの出現回数を集計し、続く$sortステージで並べ替えます。$sortでは、「1」を指定すると昇順、「-1」を指定すると降順になります。

ケース1:降順(値の大きい順)でソートする場合

結果を降順で取得したいときは、$sortの値に-1を指定します。クエリは以下の通りです。

> db.aggregationSortDemo.aggregate( {$group: {_id: '$StudentId',"TotalOccurrences": {$sum: 1}}}, {$sort: {_id: -1}} ).pretty();

出力結果:

{ "_id" : 139, "TotalOccurrences" : 2 }
{ "_id" : 128, "TotalOccurrences" : 1 }
{ "_id" : 125, "TotalOccurrences" : 1 }
{ "_id" : 110, "TotalOccurrences" : 1 }
{ "_id" : 98, "TotalOccurrences" : 1 }

この例では、StudentId「139」のデータが2件存在するため、出現回数(TotalOccurrences)も「2」と表示されています。

ケース2:昇順(値の小さい順)でソートする場合

結果を昇順で取得したいときは、$sortの値に1を指定します。クエリは以下の通りです。

> db.aggregationSortDemo.aggregate( {$group: {_id: '$StudentId', "TotalOccurrences": {$sum: 1}}}, {$sort: {_id: 1}} ).pretty();

出力結果:

{ "_id" : 98, "TotalOccurrences" : 1 }
{ "_id" : 110, "TotalOccurrences" : 1 }
{ "_id" : 125, "TotalOccurrences" : 1 }
{ "_id" : 128, "TotalOccurrences" : 1 }
{ "_id" : 139, "TotalOccurrences" : 2 }

まとめ

MongoDBの集計パイプラインでソートを行う基本は、aggregate()の中で$groupによる集計を実行し、その後ろに$sortステージを連結することです。並び順は対象フィールドに対して「1」(昇順)または「-1」(降順)で指定します。なお、最新のmongoshではfind()の結果が自動的に整形されるため、.pretty()は省略可能です。また、大量のデータを扱う場合は、$sortの前に$matchステージで条件絞り込みを行うことで、パフォーマンスの向上が期待できます。

  1. MongoDBで一括挿入(バルクインサート)を実行する方法

    MongoDBで多数のドキュメントをまとめて登録したい場合、一括挿入(バルクインサート)を利用すると効率的です。一括挿入を実行するには、initializeUnorderedBulkOp()メソッドを使用します。 一括挿入の手順 まず、initializeUnorderedBulkOp()でバルク操作のオブジェクトを作成し、insert()メソッドで複数のドキュメントを追加していきます。最後にexecute()を呼び出すことで、まとめてデータベースに書き込まれます。 > var bulkInsertDoc = db.demo663.initializeUnorderedBulkOp

  2. MongoDBの集約(Aggregation)と投影(Projection)の使い方を解説

    MongoDBの集約と投影とはMongoDBで特定のフィールドだけを抽出しながらデータを加工したい場合、aggregate()メソッドと$projectステージを組み合わせるのが効果的です。$projectは、パイプライン内で指定されたフィールドを持つドキュメントだけを次のステージへ渡す役割を果たします。この記事では、実際にコレクションを作成し、$match・$unwind・$sort・$group・$projectを組み合わせた集約パイプラインの具体的な使い方を解説します。サンプルコレクションの作成まず、insertOne()を使ってドキュメントを含むコレクションを作成します。> db