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

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 の対象フィールドを変更するだけで同じ手法が使えます。

  1. MongoDBでネストされた配列をソートする方法:$unwindと$sortを活用したクエリ

    MongoDBでドキュメント内に格納されたネストされた配列(サブドキュメントの配列)をソートしたい場合、集計パイプライン(aggregate)を使い、$unwindで配列を展開した後に$sortで並べ替え、最後に$groupで再構成するのが定番のアプローチです。この記事では、実際にコレクションを作成しながら、ネストされた配列をスコア順にソートする手順を解説します。1. サンプルコレクションの作成まず、ネストされた配列「details」を持つドキュメントを挿入してコレクションを作成します。> db.demo505.insertOne( ... { ... details: [ ..

  2. MongoDBで配列の値を使ってコレクションを並べ替える方法

    MongoDBのコレクションを配列の値を基準にソートしたい場合は、aggregate()メソッドと $sort ステージを組み合わせて使用します。さらに、配列を個々のドキュメントに分解するために $unwind も活用します。 サンプルコレクションの作成 まず、ドキュメントを含むコレクションを作成しましょう。ここでは、学生ごとの詳細情報(名前とスコア)を配列として持つドキュメントを挿入します。 > db.demo577.insertOne( ... { ... student: { ... details: [ ... { .