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

MongoDBで内部配列をソートする方法をわかりやすく解説

MongoDBの集計フレームワークを使った内部配列のソート

MongoDBでは、ドキュメント内にネストされた配列(内部配列)をソートしたいケースがよくあります。このような場合、集計フレームワーク(Aggregation Framework)を活用することで実現できます。

本記事では、実際にサンプルコレクションを作成しながら、内部配列を昇順・降順でソートする手順を詳しく解説します。

1. サンプルデータの作成

まず、動作確認用のコレクションとドキュメントを作成しましょう。以下のクエリを実行します。

> db.sortInnerArrayDemo.insertOne(
...   {
...     "EmployeeDetails":
...     {
...       "EmployeeAddress":
...       {
...         "EmployeeCountry":
...         [
...           {
...             "EmployeeZipCode":1003,
...             "EmployeeStreetName":"7885 Trusel Street"
...           },
...           {
...             "EmployeeZipCode":1001,
...             "EmployeeStreetName":"7390 Gonzales Drive"
...           },
...           {
...             "EmployeeZipCode":1002,
...             "EmployeeStreetName":"444 N.Myres Rd."
...           }
...         ]
...       }
...     }
...   }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c6f07d3da34711ecf87a5b8")
}

このドキュメントは、EmployeeDetailsEmployeeAddressEmployeeCountryという階層構造になっており、EmployeeCountryが今回ソート対象となる内部配列です。郵便番号(EmployeeZipCode)は意図的にバラバラの順序で登録しています。

2. 登録データの確認

find()メソッドを使って、登録したすべてのドキュメントを表示してみましょう。

> db.sortInnerArrayDemo.find().pretty();

実行結果は以下の通りです。

{
    "_id" : ObjectId("5c6f07d3da34711ecf87a5b8"),
    "EmployeeDetails" : {
        "EmployeeAddress" : {
            "EmployeeCountry" : [
            {
                "EmployeeZipCode" : 1003,
                "EmployeeStreetName" : "7885 Trusel Street"
            },
            {
                "EmployeeZipCode" : 1001,
                "EmployeeStreetName" : "7390 Gonzales Drive"
            },
            {
                "EmployeeZipCode" : 1002,
                "EmployeeStreetName" : "444 N.Myres Rd."
            }
        ]}
    }
}

現時点では、配列の要素が登録順のまま格納されていることが確認できます。

内部配列をソートするクエリ

内部配列のソートには、以下の4つのパイプラインステージを組み合わせます。

  • $unwind:配列を分解し、要素ごとに個別のドキュメントとして展開する
  • $sort:指定フィールドを基準に並べ替える
  • $group:展開した要素を元のドキュメントIDごとに再結合する
  • $project:元のドキュメント構造に整形して出力する

Case 1:昇順ソート(ASC)

郵便番号(EmployeeZipCode)を基準に、小さい順(昇順)に並べ替えるクエリです。$sortステージで1を指定すると昇順になります。

> db.sortInnerArrayDemo.aggregate(
... {$unwind: '$EmployeeDetails.EmployeeAddress.EmployeeCountry'},
... {$sort: {'EmployeeDetails.EmployeeAddress.EmployeeCountry.EmployeeZipCode': 1}},
... {$group: {_id: '$_id', 'EmpCountry': {$push:
'$EmployeeDetails.EmployeeAddress.EmployeeCountry'}}},
... {$project: {'EmployeeDetails.EmployeeAddress.EmployeeCountry':
'$EmpCountry'}}).pretty();

実行結果を見ると、EmployeeZipCodeを基準に内部配列が昇順(1001 → 1002 → 1003)にソートされていることがわかります。

{
    "_id" : ObjectId("5c6f07d3da34711ecf87a5b8"),
    "EmployeeDetails" : {
        "EmployeeAddress" : {
            "EmployeeCountry" : [
                {
                    "EmployeeZipCode" : 1001,
                    "EmployeeStreetName" : "7390 Gonzales Drive"
                },
                {
                    "EmployeeZipCode" : 1002,
                    "EmployeeStreetName" : "444 N.Myres Rd."
                },
                {
                    "EmployeeZipCode" : 1003,
                    "EmployeeStreetName" : "7885 Trusel Street"
                }
            ]
        }
    }
}

Case 2:降順ソート(DESC)

続いて、大きい順(降順)に並べ替える場合です。$sortステージの指定値を-1に変更するだけで対応できます。

> db.sortInnerArrayDemo.aggregate(
... {$unwind: '$EmployeeDetails.EmployeeAddress.EmployeeCountry'},
... {$sort: {'EmployeeDetails.EmployeeAddress.EmployeeCountry.EmployeeZipCode':-1}},
... {$group: {_id: '$_id', 'EmpCountry': {$push:
'$EmployeeDetails.EmployeeAddress.EmployeeCountry'}}},
... {$project: {'EmployeeDetails.EmployeeAddress.EmployeeCountry':
'$EmpCountry'}}).pretty();

実行結果では、EmployeeZipCodeを基準に降順(1003 → 1002 → 1001)でソートされています。

{
    "_id" : ObjectId("5c6f07d3da34711ecf87a5b8"),
    "EmployeeDetails" : {
        "EmployeeAddress" : {
            "EmployeeCountry" : [
                {
                    "EmployeeZipCode" : 1003,
                    "EmployeeStreetName" : "7885 Trusel Street"
                },
                {
                    "EmployeeZipCode" : 1002,
                    "EmployeeStreetName" : "444 N.Myres Rd."
                },
                {
                    "EmployeeZipCode" : 1001,
                    "EmployeeStreetName" : "7390 Gonzales Drive"
                }
            ]
        }
    }
}

まとめ

MongoDBで内部配列をソートする場合は、$unwind → $sort → $group → $projectという流れの集計パイプラインを使用します。ポイントは以下の通りです。

  • $unwindで配列要素をドキュメント単位に分解する
  • $sort1(昇順)または-1(降順)を指定して並べ替える
  • $group$pushでソート済みの要素を配列として再構築する
  • $projectで元のドキュメント構造に戻す

この手法を覚えておけば、ネストされた配列データでも柔軟に順序を制御できるようになります。ぜひ実際のプロジェクトでも活用してみてください。

  1. JavaScriptで日付を含む配列を昇順にソートする方法

    JavaScriptでは、日付文字列と数値がペアになったデータを扱う場面は少なくありません。例えば、以下のような配列があったとします。const arr = [     [ 02/13/2015, 0.096 ],     [ 11/15/2013, 0.189 ],     [ 05/15/2014, 0.11 ],     [ 12/13/2013, 0.1285 ],     [ 01/15

  2. Androidで配列の要素を並べ替える方法をわかりやすく解説

    この記事では、Androidアプリで配列の要素を並べ替え(ソート)する方法を、実際に動くサンプルコードとともに解説します。数値が入った配列を昇順に並べ替え、その結果を画面に表示するまでの一連の手順を確認していきましょう。 手順1:新規プロジェクトを作成する まず、Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目を入力してプロジェクトを作成してください。 手順2:レイアウトファイルにコードを追加する 次に、res/layout/activity_main.xml に以下のコードを記述します。 <?x