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: 単語順に並べ替えるクエリを実行する
ここからが本題です。$addFields で sortByWords という一時フィールドを生成し、$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 よりも可読性の高いクエリを書けるので、あわせて覚えておくとよいでしょう。
-
MongoDBでサブドキュメント(ネストされた配列)を並べ替えるクエリの書き方
MongoDBでは、集計パイプライン(Aggregation Pipeline)の各ステージを組み合わせることで、ドキュメント内のサブドキュメント(ネストされた配列要素)を特定の値に基づいて並べ替えることができます。本記事では、$unwind、$project、$sort、$group を使って、配列内のサブドキュメントを「給与合計」の降順でソートする具体例を解説します。サンプルコレクションの作成まず、ネストされたサブドキュメントを含むコレクションを作成します。以下の例では、「Details」フィールドの中に複数の従業員情報があり、さらにその中に「EmployeeDetails」という配列を持
-
MongoDBでネストされた配列をソートする方法:$unwindと$sortを活用したクエリ
MongoDBでドキュメント内に格納されたネストされた配列(サブドキュメントの配列)をソートしたい場合、集計パイプライン(aggregate)を使い、$unwindで配列を展開した後に$sortで並べ替え、最後に$groupで再構成するのが定番のアプローチです。この記事では、実際にコレクションを作成しながら、ネストされた配列をスコア順にソートする手順を解説します。1. サンプルコレクションの作成まず、ネストされた配列「details」を持つドキュメントを挿入してコレクションを作成します。> db.demo505.insertOne( ... { ... details: [ ..