MongoDBの集約フレームワークで配列の長さ順にソートする方法
配列の長さに基づいてドキュメントをソートしたい場合は、MongoDBの集約フレームワーク(Aggregation Framework)のaggregate()メソッドを活用します。手順としては、まず$unwindで配列を展開し、$sumを使って各ドキュメントの配列要素数をカウントした上で、$sortによって並べ替えを行います。
それでは、実際にドキュメントを含むコレクションを作成してみましょう。
> db.demo33.insertOne({"ListOfStudent":["Chris","Bob"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e17556ccfb11e5c34d898ca")
}
> db.demo33.insertOne({"ListOfStudent":["David","Adam","Mike"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e17557acfb11e5c34d898cb")
}
> db.demo33.insertOne({"ListOfStudent":["Carol","Sam","John","Robert"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e1755a3cfb11e5c34d898cc")
}
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo33.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e17556ccfb11e5c34d898ca"), "ListOfStudent" : [ "Chris", "Bob" ] }
{ "_id" : ObjectId("5e17557acfb11e5c34d898cb"), "ListOfStudent" : [ "David", "Adam", "Mike" ] }
{ "_id" : ObjectId("5e1755a3cfb11e5c34d898cc"), "ListOfStudent" : [ "Carol", "Sam", "John", "Robert" ] }
配列の長さでソートするクエリ
以下は、配列の長さ順にドキュメントをソートするためのクエリです。
> db.demo33.aggregate({$unwind:"$ListOfStudent"}, { $group : {_id:'$_id', ct:{$sum:1}}}, { $sort :{ ct: -1}} );
クエリの仕組み
- $unwind: 配列フィールド「ListOfStudent」を展開し、要素ごとに個別のドキュメントを生成します。
- $group:
_idごとにグループ化し、$sum: 1で配列の要素数(レコード数)をカウントします。 - $sort: カウント結果(ct)を降順(-1)で並べ替えます。
このクエリを実行すると、次の出力が得られます。
{ "_id" : ObjectId("5e1755a3cfb11e5c34d898cc"), "ct" : 4 }
{ "_id" : ObjectId("5e17557acfb11e5c34d898cb"), "ct" : 3 }
{ "_id" : ObjectId("5e17556ccfb11e5c34d898ca"), "ct" : 2 }
出力結果を見ると、配列に含まれる学生の数が多いドキュメントほど上位に表示されていることがわかります。「Carol」「Sam」「John」「Robert」の4人を含むドキュメントが最初に表示され、「Chris」と「Bob」の2人を含むドキュメントが最後に表示されています。昇順でソートしたい場合は、$sortの値を-1から1に変更してください。
-
MongoDBで配列要素の平均値を取得するクエリの書き方
MongoDBで配列内の数値の平均を求める方法MongoDBでは、配列に格納された複数の数値から平均値を算出したいケースがよくあります。例えば、1つのドキュメントの中に複数の点数(Marks)が配列として保存されている場合、その平均点を取得したいことがあります。このような場合、集計パイプライン(aggregation)と$avg演算子を組み合わせることで、簡単に平均値を求めることができます。$avgは、指定したフィールド(配列の場合はその全要素)の数値の平均を自動的に計算してくれる便利な演算子です。以下、具体的な手順を見ていきましょう。1. コレクションを作成し、ドキュメントを挿入するまず、i
-
MongoDBアグリゲーションで配列内の要素サブセットを合計する方法
MongoDBのアグリゲーションパイプラインを使用して、配列内の一部の要素(サブセット)を合計したい場合があります。そんなときは、$first演算子と$sum演算子を組み合わせることで実現できます。この記事では、実際のコレクションを作成しながら、具体的な手順をサンプルコード付きでわかりやすく解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下の例では、数値の配列「Values」を持つドキュメントをinsertOne()メソッドで挿入しています。> db.demo610.insertOne({Values:[10,20,30,40,50]}