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

【MongoDB】一方のフィールドがnullの場合に別のフィールドを選択するクエリ ― $ifNull演算子の使い方

MongoDBでは、「片方のフィールドがnullならもう一方のフィールドの値を取得し、両方のフィールドに値が入っている場合は最初のフィールドを優先して取得したい」というケースがあります。このような場合には、集計パイプライン(aggregation)で使える$ifNull演算子が便利です。

$ifNull演算子とは

$ifNullは複数の式を引数に取り、最初のnull以外の値を返す演算子です。したがって、最初のフィールドがnullであれば2番目のフィールドの値に置き換えられ、両方のフィールドに値が存在する場合はそのまま最初のフィールドの値が返されます。まさに本件の要件にぴったり合致します。

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

まず、ドキュメントを含むコレクションを作成します。

> db.querySelectDemo.insertOne({"Value1":10,"Value2":null});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cefc0ceef71edecf6a1f6b6")
}
> db.querySelectDemo.insertOne({"Value1":null,"Value2":30});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cefc0d7ef71edecf6a1f6b7")
}
> db.querySelectDemo.insertOne({"Value1":60,"Value2":40});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cefc0e2ef71edecf6a1f6b8")
}

コレクション内の全ドキュメントを表示する

find()メソッドを使って、作成したコレクション内のすべてのドキュメントを確認してみましょう。

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

出力結果

{
   "_id" : ObjectId("5cefc0ceef71edecf6a1f6b6"),
   "Value1" : 10,
   "Value2" : null
}
{
   "_id" : ObjectId("5cefc0d7ef71edecf6a1f6b7"),
   "Value1" : null,
   "Value2" : 30
}
{
   "_id" : ObjectId("5cefc0e2ef71edecf6a1f6b8"),
   "Value1" : 60,
   "Value2" : 40
}

1件目は「Value1=10 / Value2=null」、2件目は「Value1=null / Value2=30」、3件目は「Value1=60 / Value2=40」と、それぞれ異なるパターンのデータが登録されています。

$ifNullを使って一方のフィールドがnullの場合に別のフィールドを選択する

以下が、Value1がnullの場合にValue2の値を選択するクエリです。$projectステージ内で$ifNullを指定し、Value1がnullならValue2の値を代入しています。

> db.querySelectDemo.aggregate([
    {
       $project: {
          "Value1": { "$ifNull": [ "$Value1", "$Value2" ] }
       }
    }
]);

出力結果

{ "_id" : ObjectId("5cefc0ceef71edecf6a1f6b6"), "Value1" : 10 }
{ "_id" : ObjectId("5cefc0d7ef71edecf6a1f6b7"), "Value1" : 30 }
{ "_id" : ObjectId("5cefc0e2ef71edecf6a1f6b8"), "Value1" : 60 }

実行結果のポイント

  • 1件目:Value1に10という値が入っているため、そのまま10が出力されます。
  • 2件目:Value1がnullのため、代わりにValue2の値である30が出力されます。
  • 3件目:両方のフィールドに値がありますが、$ifNullは最初の引数を優先するため60(Value1)が出力されます。

このように$ifNull演算子を使えば、nullチェックと代替値の選択を1つの式で簡潔に実現できます。なお、$ifNullの第2引数には固定値(例:「"デフォルト値"」)を指定することも可能なので、フィールドが存在しない・nullである場合のデフォルト値設定としても活用できます。

  1. MongoDBでフィールドの戻り値を制限するクエリの書き方($slice演算子の使い方)

    MongoDBでフィールドの戻り値を制限するクエリの書き方MongoDBで配列フィールドの要素数を制限して取得したい場合は、$slice演算子を使用します。この演算子を活用することで、クエリ結果として返す配列の要素数を柔軟にコントロールできます。ここでは、具体的な手順をサンプルコードとともに解説します。1. コレクションとドキュメントの作成まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成します。> db.demo594.insertOne(...    {...    &n

  2. 【MongoDB】$addFieldsで新しいフィールドを追加し、価格を特定の数値で割った結果を連結する方法

    MongoDBで既存のドキュメントに新しいフィールドを追加するには、集計パイプラインの$addFieldsステージを使用します。本記事では、ネストされた配列内の商品価格(ProductPrice)を特定の数値で割り、その結果を文字列として連結して新しいフィールドに格納する方法を、サンプルコードとともに解説します。 サンプルコレクションの作成 まず、insertOne()メソッドを使用して、ドキュメントを含むコレクションを作成します。 > db.demo719.insertOne( ... { ... Number:7374644, ... de