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

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

MongoDBでドキュメント内に格納されたネストされた配列(サブドキュメントの配列)をソートしたい場合、集計パイプライン(aggregate)を使い、$unwindで配列を展開した後に$sortで並べ替え、最後に$groupで再構成するのが定番のアプローチです。

この記事では、実際にコレクションを作成しながら、ネストされた配列をスコア順にソートする手順を解説します。

1. サンプルコレクションの作成

まず、ネストされた配列「details」を持つドキュメントを挿入してコレクションを作成します。

> db.demo505.insertOne(
... {
...     "details": [
...     {
...        Name:"Chris",
...        "Score":58
...     }, {
...
...        Name:"Bob",
...        "Score":45
...      }, {
...
...           Name:"John",
...           "Score":68
...      }, {
...
...          Name:"David",
...          "Score":46
...      }
...     ]
... }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e882a6b987b6e0e9d18f574")
}

2. find()メソッドで全ドキュメントを表示

挿入したデータをfind()メソッドで確認してみましょう。

> db.demo505.find();

実行すると、以下のような出力が得られます。現時点では配列内の要素は挿入順に並んでいます。

{ "_id" : ObjectId("5e882a6b987b6e0e9d18f574"), "details" : [
    { "Name" : "Chris", "Score" : 58 },
    { "Name" : "Bob", "Score" : 45 },
    { "Name" : "John", "Score" : 68 },
    { "Name" : "David", "Score" : 46 }
] }

3. ネストされた配列をソートするクエリ

それでは、配列内の要素を「Score」の昇順にソートするクエリを見てみましょう。$unwind$sort$group の3段階のパイプラインで構成します。

> db.demo505.aggregate([
...     { $unwind: "$details" },
...     { $sort: { "details.Score": 1 } },
...     { $group: { _id: "$_id", details: { $push: "$details" } } }
... ]);

各ステージの役割は次のとおりです。

  • $unwind:ネストされた配列「details」を個別のドキュメントに展開します。
  • $sort:「details.Score」を基準に昇順(1)で並べ替えます。降順にしたい場合は「-1」を指定します。
  • $group:元のドキュメントの_idごとに要素をまとめ直し、$pushで配列として再構築します。

4. 実行結果

上記のクエリを実行すると、Scoreの昇順にソートされた配列が出力されます。

{ "_id" : ObjectId("5e882a6b987b6e0e9d18f574"), "details" : [
    { "Name" : "Bob", "Score" : 45 },
    { "Name" : "David", "Score" : 46 },
    { "Name" : "Chris", "Score" : 58 },
    { "Name" : "John", "Score" : 68 } 
] }

このように、$unwindで配列を展開してから$sortで並べ替え、$groupで元の形に戻すことで、MongoDBでもネストされた配列を自由にソートできます。なお、複数のドキュメントが存在する場合も、_idごとにグループ化されるため、各ドキュメントの配列が独立して正しくソートされます。

  1. MongoDBでサブドキュメントの配列をクエリする方法

    MongoDBでサブドキュメントの配列をクエリするには、集計パイプラインの$unwindを使用します。$unwindは、配列フィールドを展開し、配列の各要素ごとに個別のドキュメントを生成するステージです。これにより、配列内のサブドキュメントを個別にフィルタリングできるようになります。ここでは、大学の情報を含むコレクションを作成し、その中から特定の条件に一致するサブドキュメントを抽出する手順を解説します。コレクションの作成まず、insertOne()メソッドを使って、サブドキュメントの配列を含むドキュメントを挿入しましょう。> db.demo499.insertOne({... "

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

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