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

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

MongoDBのコレクションを配列の値を基準にソートしたい場合は、aggregate()メソッドと $sort ステージを組み合わせて使用します。さらに、配列を個々のドキュメントに分解するために $unwind も活用します。

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

まず、ドキュメントを含むコレクションを作成しましょう。ここでは、学生ごとの詳細情報(名前とスコア)を配列として持つドキュメントを挿入します。

> db.demo577.insertOne(
...     {
...       "student": {
...          "details": [
...             {
...                Name: "Chris",
...                Score: 45
...             },
...             {
...                Name: "Bob",
...                Score: 33
...             },
...             {
...                Name: "David",
...                Score: 48
...             }
...          ]
...       }
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e916ff1581e9acd78b427ff")
}

insertOne() メソッドが正常に実行されると、挿入されたドキュメントの ObjectId が返されます。

登録したドキュメントの確認

find() メソッドを使って、コレクション内のすべてのドキュメントを表示します。

> db.demo577.find();

このクエリを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e916ff1581e9acd78b427ff"), "student" : { "details" : [
   { "Name" : "Chris", "Score" : 45 },
   { "Name" : "Bob", "Score" : 33 },
   { "Name" : "David", "Score" : 48 }
] } }

現時点では、配列内の要素は挿入された順番(Chris → Bob → David)で格納されています。

配列の値でソートするクエリ

配列の値を基準にコレクションをソートするには、以下のようにクエリを記述します。ポイントは次の3つのステップです。

  • $unwind: 配列フィールドを個別のドキュメントに分解します
  • $sort: 指定したフィールド(ここでは Score)を基準に降順(-1)で並べ替えます
> db.demo577.aggregate([
...    {$unwind:"$student"},
...    {$unwind:"$student.details"},
...
...    {$sort:{"student.details.Score":-1}}
... ]);

このクエリでは、最初の $unwind で「student」フィールドを、次の $unwind でネストされた「details」配列をそれぞれ分解しています。そして $sort の値を -1(降順)に指定することで、スコアの高い順に並べ替えています。

ソート結果の出力

上記の集計パイプラインを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e916ff1581e9acd78b427ff"), "student" : { "details" : { "Name" : "David", "Score" : 48 } } }
{ "_id" : ObjectId("5e916ff1581e9acd78b427ff"), "student" : { "details" : { "Name" : "Chris", "Score" : 45 } } }
{ "_id" : ObjectId("5e916ff1581e9acd78b427ff"), "student" : { "details" : { "Name" : "Bob", "Score" : 33 } } }

結果を見ると、配列内の各要素がスコアの降順(David: 48 → Chris: 45 → Bob: 33)に正しく並べ替えられていることがわかります。

まとめ

MongoDBで配列内の値を基準にデータをソートする場合は、aggregate() パイプラインの中で $unwind によって配列を分解し、その後 $sort ステージで目的のフィールドを指定して並べ替えます。昇順にしたい場合は 1 を、降順にしたい場合は -1 を指定してください。このテクニックは、ランキング表示やスコア順の一覧作成など、さまざまな場面で役立ちます。

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

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

  2. MongoDBで配列をクエリして特定の値を取得する方法

    配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ...    { ...        "details": [ ...            { ...                "