MongoDBでサブドキュメント(配列内の要素)を並べ替える方法|$unwindと$sortの使い方
MongoDBでサブドキュメントを基準に並べ替える方法
MongoDBでサブドキュメント(配列内の要素)を基準にデータを並べ替えるには、集計パイプライン(aggregation pipeline)の$sortステージを使用します。この記事では、実際のコード例を通じて、コレクションの作成から並べ替えまでの手順をわかりやすく解説します。
1. コレクションの作成
まず、insertOne()メソッドを使って、配列形式のサブドキュメントを持つドキュメントをコレクションに登録します。
> db.demo245.insertOne(
... {
... "_id": 101,
... "deatils": [
... { "DueDate": new ISODate("2019-01-10"), "Value": 45},
... {"DueDate": new ISODate("2019-11-10"), "Value": 34 }
... ]
... }
...);
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo245.insertOne(
... {
... "_id": 102,
... "details": [
... { "DueDate": new ISODate("2019-12-11"), "Value": 29},
... {"DueDate": new ISODate("2019-03-10"), "Value": 78}
... ]
... }
...);
{ "acknowledged" : true, "insertedId" : 102 }
2. 登録したドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo245.find();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : 101, "deatils" : [
{ "DueDate" : ISODate("2019-01-10T00:00:00Z"), "Value" : 45 },
{ "DueDate" : ISODate("2019-11-10T00:00:00Z"), "Value" : 34 }
]
}
{
"_id" : 102, "details" : [
{ "DueDate" : ISODate("2019-12-11T00:00:00Z"), "Value" : 29 },
{ "DueDate" : ISODate("2019-03-10T00:00:00Z"), "Value" : 78 }
]
}
3. サブドキュメントを並べ替える集計クエリ
続いて、サブドキュメントを基準に並べ替えるためのクエリを見ていきましょう。ポイントは、$unwind・$sort・$groupの3つのステージを組み合わせることです。
> db.demo245.aggregate([
... { "$unwind": "$details" },
... { "$sort": { "_id": 1, "details.Value": -1 } },
... { "$group": {
... "_id": "$_id",
... "details": { "$push": "$details" }
... }},
... { "$sort": { "details.Value": -1 } }
...])
各ステージの役割は次のとおりです。
- $unwind: 配列フィールド「details」を展開し、要素ごとに個別のドキュメントへ分割します。
- $sort: 「_id」昇順、「details.Value」降順で並べ替えます(1が昇順、-1が降順)。
- $group: 「_id」ごとにドキュメントをまとめ直し、
$pushでdetails配列を元の構造に復元します。
このクエリを実行すると、次のような出力が得られます。
{ "_id" : 102, "details" : [ { "DueDate" : ISODate("2019-03-10T00:00:00Z"), "Value" : 78 }, { "DueDate" : ISODate("2019-12-11T00:00:00Z"), "Value" : 29 } ] }
注意点:フィールド名の統一
上記の例では、最初のドキュメント(_id: 101)のフィールド名が「deatils」になっており、集計対象の「details」と一致していません。そのため、$unwindの段階でこのドキュメントは除外され、最終結果には_id: 102のみが表示されます。実際に運用する際は、並べ替えたい配列のフィールド名をすべてのドキュメントで統一するよう注意してください。
このように、$unwindと$sort、$groupを組み合わせることで、各ドキュメント内のサブドキュメント(配列要素)を、Valueなどの任意のフィールドを基準に自由に並べ替えることができます。日付(DueDate)や数値など、さまざまなフィールドに応用できるので、ぜひ活用してみてください。
-
MongoDBで自然順序($natural)を使ってドキュメントを並べ替える方法
MongoDBで自然順序($natural)によるソートを行う方法MongoDBでは、$natural 演算子を使用することで、ドキュメントが格納されている「自然な順序」のままデータを取得できます。ここでは、実際にサンプルコレクションを作成し、ドキュメントを挿入しながら動作を確認していきましょう。1. コレクションの作成とドキュメントの挿入まず、insertOne() メソッドを使って複数のドキュメントを登録します。> db.demo684.insertOne({Value:10}); { acknowledged : true, insertedId : ObjectI
-
MongoDBで配列の値を使ってコレクションを並べ替える方法
MongoDBのコレクションを配列の値を基準にソートしたい場合は、aggregate()メソッドと $sort ステージを組み合わせて使用します。さらに、配列を個々のドキュメントに分解するために $unwind も活用します。 サンプルコレクションの作成 まず、ドキュメントを含むコレクションを作成しましょう。ここでは、学生ごとの詳細情報(名前とスコア)を配列として持つドキュメントを挿入します。 > db.demo577.insertOne( ... { ... student: { ... details: [ ... { .