MongoDBで配列を並べ替える最も簡単な方法
MongoDBで配列の中身を並べ替えたいとき、最も簡単なのは集計パイプラインの $sort を使う方法です。この記事では、実際にコレクションを作成しながら、$unwind・$sort・$group を組み合わせて配列要素を日付順にソートする手順をわかりやすく解説します。
サンプルコレクションの作成
まず、ドキュメントを挿入してコレクションを作成します。
> db.demo242.insertOne(
...
... {"details2":
... [
... {"ShipingDate":new ISODate("2019-10-11"),"Price":1400},
... {"ShipingDate":new ISODate("2019-10-01"),"Price":1600 }
... ]
... }
...
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4429229af932883c61ea44")
}
続いて、find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo242.find();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e4429229af932883c61ea44"), "details2" : [
{ "ShipingDate" : ISODate("2019-10-11T00:00:00Z"), "Price" : 1400 },
{ "ShipingDate" : ISODate("2019-10-01T00:00:00Z"), "Price" : 1600 }
]
}
現時点では、「details2」配列内の要素が出荷日の降順(新しい日付が先)になっていることが確認できます。
配列をソートするクエリ
以下は、MongoDBで配列を並べ替えるためのクエリです。$unwind で配列を個々のドキュメントに展開し、$sort で「ShipingDate」の昇順に並べ替えた後、$group と $push を使って元のドキュメント構造へ再構成しています。
> db.demo242.aggregate([ {$unwind: "$details2"}, {$sort: {"details2.ShipingDate":1}}, {$group: {_id:"$_id", details2: {$push:"$details2.ShipingDate"}}} ]);
このクエリを実行すると、次のような結果になります。
{ "_id" : ObjectId("5e4429229af932883c61ea44"), "details2" : [ ISODate("2019-10-01T00:00:00Z"), ISODate("2019-10-11T00:00:00Z") ] }
出力を見ると、出荷日(ShipingDate)が古い順(昇順)に並べ替えられていることがわかります。このように、$unwind → $sort → $group の流れを組み合わせれば、MongoDBでもネストされた配列の要素を自由にソートできます。価格など他のフィールドを基準にしたい場合も、$sort の対象フィールドを変更するだけで同じ手法が使えます。
-
MongoDBでネストされた配列をソートする方法:$unwindと$sortを活用したクエリ
MongoDBでドキュメント内に格納されたネストされた配列(サブドキュメントの配列)をソートしたい場合、集計パイプライン(aggregate)を使い、$unwindで配列を展開した後に$sortで並べ替え、最後に$groupで再構成するのが定番のアプローチです。この記事では、実際にコレクションを作成しながら、ネストされた配列をスコア順にソートする手順を解説します。1. サンプルコレクションの作成まず、ネストされた配列「details」を持つドキュメントを挿入してコレクションを作成します。> db.demo505.insertOne( ... { ... details: [ ..
-
MongoDBで配列の値を使ってコレクションを並べ替える方法
MongoDBのコレクションを配列の値を基準にソートしたい場合は、aggregate()メソッドと $sort ステージを組み合わせて使用します。さらに、配列を個々のドキュメントに分解するために $unwind も活用します。 サンプルコレクションの作成 まず、ドキュメントを含むコレクションを作成しましょう。ここでは、学生ごとの詳細情報(名前とスコア)を配列として持つドキュメントを挿入します。 > db.demo577.insertOne( ... { ... student: { ... details: [ ... { .