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

MongoDBで配列内の埋め込みドキュメントにフィールドを追加する方法

MongoDBでは、update()メソッドと位置指定演算子「$」を組み合わせることで、配列内の埋め込みドキュメントに新しいフィールドを追加できます。まずは、サンプルとなるドキュメントを含むコレクションを作成しましょう。

> db.addAFieldDemo.insertOne(
...   {
...
...        "ClientName" : "Larry",
...        "ClientCountryName" : "US",
...        "ClientOtherDetails" : [
...           {
...              "ClientProjectName":"Online Banking System"
...           }
...        ]
...   }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd44bdc2cba06f46efe9ee8")
}

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

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

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

{
    "_id" : ObjectId("5cd44bdc2cba06f46efe9ee8"),
    "ClientName" : "Larry",
    "ClientCountryName" : "US",
    "ClientOtherDetails" : [
       {
           "ClientProjectName" : "Online Banking System"
       }
    ]
}

それでは、配列内の埋め込みドキュメントにフィールドを追加するクエリを見ていきましょう。ここでは、$elemMatch演算子で対象の配列要素を特定し、$setと位置指定演算子「$」を組み合わせて新しいフィールドを追加しています。

> db.addAFieldDemo.update({ClientOtherDetails:{$elemMatch:{"ClientProjectName" : "Online Banking System"}}},
... {$set :{'ClientOtherDetails.$.isMarried':true}},true);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

ポイントは、更新対象のフィールドパスを「ClientOtherDetails.$.isMarried」という形式で指定している点です。「$」は、クエリ条件(この場合は$elemMatch)にマッチした配列要素の位置を自動的に参照するため、インデックス番号を意識せずに目的の要素へフィールドを追加できます。

最後に、もう一度すべてのドキュメントを表示して、結果を確認してみましょう。

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

実行すると、以下のように配列内の埋め込みドキュメントに「isMarried」フィールドが追加されていることがわかります。

{
    "_id" : ObjectId("5cd44bdc2cba06f46efe9ee8"),
    "ClientName" : "Larry",
    "ClientCountryName" : "US",
    "ClientOtherDetails" : [
       {
           "ClientProjectName" : "Online Banking System",
           "isMarried" : true
       }
    ]
}

補足:新しいバージョンでの注意点

MongoDB 4.2以降では、update()メソッドは非推奨(deprecated)となっており、代わりにupdateOne()updateMany()の使用が推奨されています。これらのメソッドでも、上記と同じように$elemMatchと位置指定演算子「$」を組み合わせた構文がそのまま利用できます。

  1. 【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方

    MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド

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

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