MongoDBのaggregate()で配列をソートし、全フィールドを投影する方法
MongoDBで配列を並べ替えて全フィールドを投影するには
MongoDBの集計フレームワーク(aggregate())を使えば、ドキュメント内の配列要素を並べ替え、その結果をすべてのフィールドとともに投影することができます。並べ替えには $sort、投影(フィールドの整形)には $project を使用します。
全体の流れは以下のステップになります。
- $unwind:配列を分解して、各要素を個別のドキュメントとして扱えるようにします
- $sort:指定したフィールドを基準に昇順・降順で並べ替えます
- $group:分解した要素を元のドキュメント単位に再グループ化します
- $project:出力するフィールドの形式を整えます
1. コレクションの作成とドキュメントの挿入
まず、サンプル用のコレクションを作成しましょう。ここでは Values という配列フィールドを持つドキュメントを挿入します。
> db.demo252.insertOne(
... { "Values" : [ { "v1" : 20, "v2" : 30 }, { "v1" : 20, "v2" : 20 }, { "v1" : 10, "v2" : 7 } ] }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e46c2761627c0c63e7dba78")
}2. find()メソッドですべてのドキュメントを表示
find() メソッドを使うと、コレクション内のすべてのドキュメントを確認できます。
> db.demo252.find();
このクエリを実行すると、次のような出力が得られます。現時点では配列は挿入した順序のままになっています。
{ "_id" : ObjectId("5e46c2761627c0c63e7dba78"), "Values" : [ { "v1" : 20, "v2" : 30 }, { "v1" : 20, "v2" : 20 }, { "v1" : 10, "v2" : 7 } ] }3. aggregate()で配列をソートし、全フィールドを投影するクエリ
次のパイプラインでは、まず $unwind で配列を分解し、v2 と v1 の値を基準に昇順ソートを行います。その後 $group で元のドキュメントにまとめ直し、最後に $project で _id と Values を整形して出力します。
> db.demo252.aggregate([
... { "$unwind": "$Values"},
... { "$sort": {"Values.v2":1, "Values.v1": 1}},
... { "$group": {
... "_id": {
... "_id": "$_id"
... },
... "st": { "$push":"$Values"}
... }},
... { "$project": {
... "_id": "$_id._id",
... "Values": "$st"
... }}
...]);4. 実行結果
このクエリを実行すると、配列内の要素が v2 の値を基準に昇順(7 → 20 → 30)に並べ替えられていることがわかります。
{ "_id" : ObjectId("5e46c2761627c0c63e7dba78"), "Values" : [ { "v1" : 10, "v2" : 7 }, { "v1" : 20, "v2" : 20 }, { "v1" : 20, "v2" : 30 } ] }ポイント解説
$sortの値を-1にすると降順ソートになります。$pushを使うことで、ソート済みの配列要素を元の順序どおりにグループへ格納できます。$projectで"_id": "$_id._id"と指定することにより、グループ化の際に入れ子になった_idを元の形に戻しています。
このように、$unwind → $sort → $group → $project の組み合わせは、MongoDBで配列の中身を自由に並べ替えたい場合の定番テクニックです。ぜひ実際のプロジェクトでも活用してみてください。
-
MongoDBで埋め込みドキュメントの配列をクエリし、新しいドキュメントをプッシュする方法
MongoDBで埋め込みドキュメントの配列に対してクエリを実行し、条件を満たす場合にのみ新しいドキュメントを追加したい場合は、updateメソッドと$push演算子を組み合わせて使用します。ここでは、実際のサンプルコードを使って手順を詳しく解説します。 手順1:サンプルコレクションの作成 まず、insertOne()メソッドを使って、埋め込みドキュメントの配列を含むドキュメントを作成しましょう。 > db.demo573.insertOne( ... { ... _id :101, ... SearchInformation : [ ...
-
MongoDBで「_id」以外のすべてのフィールド値を表示するクエリ方法
MongoDBでは、ドキュメントを取得すると自動的に _id フィールドが含まれますが、場合によってはこのフィールドを除外し、他のフィールド値だけを表示したいことがあります。本記事では、コレクションの作成から、_id を除いたすべてのフィールド値を表示するまでの一連の手順を解説します。1. ドキュメントを含むコレクションを作成するまずは、サンプルとなるコレクションを作成しましょう。以下のコマンドを実行して、複数のドキュメントを一括挿入します。> db.demo590.insert([... { "Name": "