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

MongoDBで特定の単語順に並べ替えるクエリの書き方($addFieldsと$cond活用)

MongoDBでは、通常の $sort だけでは「特定の単語を任意の順序で並べ替える」という処理ができません。そんなときに便利なのが、アグリゲーションフレームワークの $addFields$cond(条件演算子)を組み合わせた手法です。この記事では、実際のコード例とともにその手順をわかりやすく解説します。

基本的な考え方

並べ替えたい単語ごとに数値の優先度(0、1、2…)を割り当てる一時フィールドを $addFields で動的に作成し、そのフィールドを基準に $sort で昇順ソートする、という流れになります。これにより、アルファベット順とは異なる独自の並び順を実現できます。

手順1: サンプルコレクションを作成する

まずは demo62 コレクションにドキュメントを挿入してみましょう。

> db.demo62.insertOne({"Subject":"MySQL"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e287084cfb11e5c34d8992f")
}
> db.demo62.insertOne({"Subject":"MongoDB"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e287085cfb11e5c34d89930")
}
> db.demo62.insertOne({"Subject":"Java"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e287086cfb11e5c34d89931")
}

手順2: 登録済みドキュメントを確認する

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

> db.demo62.find();

実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e287084cfb11e5c34d8992f"), "Subject" : "MySQL" }
{ "_id" : ObjectId("5e287085cfb11e5c34d89930"), "Subject" : "MongoDB" }
{ "_id" : ObjectId("5e287086cfb11e5c34d89931"), "Subject" : "Java" }

手順3: 単語順に並べ替えるクエリを実行する

ここからが本題です。$addFieldssortByWords という一時フィールドを生成し、$cond を入れ子にして各単語に優先度を振り分けます。「MongoDB」には0、「MySQL」には1、それ以外(ここでは「Java」)には2を割り当てています。

> db.demo62.aggregate([
...    {
...       $addFields: {
...          sortByWords: {
...             $cond: [
...                { $eq: ["$Subject", "MongoDB"] },
...                0,
...                { $cond: [{ $eq: ["$Subject", "MySQL"] }, 1, 2] }
...             ]
...          }
...       }
...    },
...
...    {
...       $sort: {
...          sortByWords: 1
...       }
...    }
... ]);

このクエリを実行すると、以下のように「MongoDB → MySQL → Java」の順に並べ替えられた結果が出力されます。

{ "_id" : ObjectId("5e287085cfb11e5c34d89930"), "Subject" : "MongoDB", "sortByWords" : 0 }
{ "_id" : ObjectId("5e287084cfb11e5c34d8992f"), "Subject" : "MySQL", "sortByWords" : 1 }
{ "_id" : ObjectId("5e287086cfb11e5c34d89931"), "Subject" : "Java", "sortByWords" : 2 }

まとめ

任意の単語順での並べ替えが必要なケースでは、$addFields$cond を組み合わせてソート用の数値フィールドを生成し、それを $sort に渡すのが定番のテクニックです。条件が多くなる場合は $switch 演算子を使うと、入れ子の $cond よりも可読性の高いクエリを書けるので、あわせて覚えておくとよいでしょう。

  1. MongoDBでサブドキュメント(ネストされた配列)を並べ替えるクエリの書き方

    MongoDBでは、集計パイプライン(Aggregation Pipeline)の各ステージを組み合わせることで、ドキュメント内のサブドキュメント(ネストされた配列要素)を特定の値に基づいて並べ替えることができます。本記事では、$unwind、$project、$sort、$group を使って、配列内のサブドキュメントを「給与合計」の降順でソートする具体例を解説します。サンプルコレクションの作成まず、ネストされたサブドキュメントを含むコレクションを作成します。以下の例では、「Details」フィールドの中に複数の従業員情報があり、さらにその中に「EmployeeDetails」という配列を持

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

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