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

MongoDBでサブドキュメントにフィールドを追加する方法【update()と$setの使い方】

MongoDBでは、update()メソッドと$set演算子を組み合わせることで、既存のサブドキュメント(配列内の要素)に新しいフィールドを簡単に追加できます。この記事では、実際のコード例を使いながら、その手順をわかりやすく解説します。

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

まずは、ドキュメントを含むコレクションを作成しましょう。ここではinsertOne()メソッドを使用して、配列形式のサブドキュメントを持つデータを挿入します。

> db.addExtraFieldDemo.insertOne(
    {
      "_id": 1,
      "UserName": "Larry",
      "UserOtherDetails": [
        {
          "UserCountryName": "US",
          "UserAge": 23
        },
        {
          "UserCountryName": "UK",
          "UserAge": 24
        }
      ]
    }
);
{ "acknowledged" : true, "insertedId" : 1 }

UserOtherDetailsフィールドはオブジェクトの配列になっており、各要素がサブドキュメントとして扱われます。この配列内の各サブドキュメントに対して、後ほど新しいフィールドを追加していきます。

2. 作成したドキュメントの確認

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

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

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

{
   "_id" : 1,
   "UserName" : "Larry",
   "UserOtherDetails" : [
      {
         "UserCountryName" : "US",
         "UserAge" : 23
      },
      {
         "UserCountryName" : "UK",
         "UserAge" : 24
      }
   ]
}

3. サブドキュメントへのフィールド追加

それでは、サブドキュメントに新しいフィールドを追加するクエリを見ていきましょう。ポイントは、パスの指定方法です。UserOtherDetails.0.isMarried_のように、配列のインデックス番号(0から始まる)を指定することで、特定のサブドキュメントを対象にできます。

> db.addExtraFieldDemo.update({ "_id":1 },{ "$set": { "UserOtherDetails.0.isMarried_" : true }});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

このクエリの意味は次のとおりです。

  • { "_id": 1 }:更新対象のドキュメントを指定する条件
  • $set:指定したフィールドを追加・更新する演算子
  • UserOtherDetails.0.isMarried_UserOtherDetails配列の0番目(最初)のサブドキュメントにisMarried_フィールドを追加

実行結果のnModified : 1は、1件のドキュメントが正常に更新されたことを示しています。

4. 更新結果の確認

もう一度ドキュメントを表示して、フィールドが正しく追加されたか確認してみましょう。

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

実行すると、以下の出力が得られます。

{
   "_id" : 1,
   "UserName" : "Larry",
   "UserOtherDetails" : [
      {
         "UserCountryName" : "US",
         "UserAge" : 23,
         "isMarried_" : true
      },
      {
         "UserCountryName" : "UK",
         "UserAge" : 24
      }
   ]
}

0番目のサブドキュメントにisMarried_ : trueという新しいフィールドが追加されていることが確認できました。一方、1番目のサブドキュメントには影響していません。

まとめ

MongoDBでサブドキュメントにフィールドを追加するには、update()メソッドの$set演算子を使い、「フィールド名.インデックス.追加したいフィールド名」という形式でパスを指定します。なお、モダンなMongoDB(4.2以降)ではupdateOne()updateMany()の使用が推奨されており、同じ構文で同様の操作が可能です。また、配列内のすべての要素に一括でフィールドを追加したい場合は、$[](all positional operator)を活用すると便利です。

  1. MongoDBでドキュメントフィールドの値から別の値(TotalPrice − Discount)を差し引いて計算する方法

    MongoDBでは、aggregate()内の $subtract 演算子を使うことで、ドキュメントフィールドの値から別のフィールドの値を差し引いた結果を計算できます。例えば、総額(TotalPrice)から割引額(DiscountPrice)を引いた実質価格を求めるようなケースに便利です。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下のコマンドでコレクションにドキュメントを挿入します。> db.demo599.insertOne({TotalPrice:250,DiscountPrice:35});{    ackno

  2. 既存のMongoDBドキュメントにリストやオブジェクト型のフィールドを追加する方法

    既存のMongoDBドキュメントに、オブジェクト型や配列(リスト)型など特定のデータ型を持つ新しいフィールドを追加したい場合、$set 演算子を使用します。$set は指定したフィールドが存在しない場合は新しく作成し、すでに存在する場合は値を更新してくれるため、フィールドの追加にも最適です。1. コレクションとドキュメントの作成まず、insertOne() メソッドを使ってサンプルのコレクションを作成します。> db.demo732.insertOne({_id:1,Language:"English"}); { "acknowledged" :