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

MongoDBの$set演算子でネストされた値・埋め込みドキュメントを更新する方法

MongoDBで$setを使ってネストされたフィールドを更新する基本構文

MongoDBでは、$set 演算子を使用することで、埋め込みドキュメント(ネストされたドキュメント)内の特定のフィールドだけを効率的に更新できます。ドキュメント全体を置き換える必要はありません。

ネストされた値を更新するための基本構文は以下の通りです。

db.yourCollectionName.update({ }, { $set: { "yourOuterFieldName.yourInnerFieldName": "yourValue" } });

ポイントは、外側のフィールド名と内側のフィールド名をドット(.)でつなげたパスを指定する点です。これにより、MongoDBは埋め込みドキュメントの中の該当フィールドのみを書き換えます。

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

実際に動作を確認するために、サンプルドキュメントを含むコレクションを作成しましょう。以下のクエリを実行します。

> db.updateNestedValueDemo.insertOne({"CustomerName":"Chris",
    ... "CustomerDetails":{"CustomerAge":25,"CustomerCompanyName":"Google","CustomerCityName":"US"}});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c8fccc4d3c9d04998abf015")
}

この例では、「CustomerDetails」という埋め込みドキュメントの中に、年齢・会社名・都市名が格納されています。

登録データの確認

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

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

実行結果は以下の通りです。

{
    "_id" : ObjectId("5c8fccc4d3c9d04998abf015"),
    "CustomerName" : "Chris",
    "CustomerDetails" : {
        "CustomerAge" : 25,
        "CustomerCompanyName" : "Google",
        "CustomerCityName" : "US"
    }
}

$setを使ったネストされた値の更新

それでは、$set を使用して埋め込みドキュメント内の「CustomerCompanyName」を更新してみましょう。クエリは以下の通りです。

> db.updateNestedValueDemo.update({ }, { $set: { "CustomerDetails.CustomerCompanyName": "Dell" } });
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

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

更新結果の確認

再度 find() メソッドを実行して、更新が反映されているか確認します。

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

実行結果は以下の通りです。

{
    "_id" : ObjectId("5c8fccc4d3c9d04998abf015"),
    "CustomerName" : "Chris",
    "CustomerDetails" : {
        "CustomerAge" : 25,
        "CustomerCompanyName" : "Dell",
        "CustomerCityName" : "US"
    }
}

上記の出力を見ると、ネストされたフィールド「CustomerCompanyName」が「Google」から「Dell」に正しく変更されていることがわかります。他のフィールド(CustomerAge や CustomerCityName)には影響を与えていません。

補足:updateOne / updateMany の利用について

MongoDB 4.2以降では、旧式の update() メソッドは非推奨となっており、代わりに updateOne()updateMany() の使用が推奨されています。例えば、最初に一致した1件だけを更新する場合は以下のように記述します。

db.updateNestedValueDemo.updateOne(
   { "CustomerName": "Chris" },
   { $set: { "CustomerDetails.CustomerCompanyName": "Dell" } }
);

条件に一致するすべてのドキュメントを更新したい場合は updateMany() を使います。また、より深くネストされた構造の場合も、同様にドット記法でパスを連ねることで任意の階層のフィールドを更新できます。

  1. 【MongoDB】ネストされた(入れ子構造の)ドキュメントを更新するクエリの書き方

    MongoDBでは、入れ子(ネスト)になったサブドキュメントのフィールドを更新する際、update()メソッドとドット表記(dot notation)を組み合わせて使用します。ドット表記を使うことで、深い階層にあるフィールドを直接指定して値を変更できます。1. サンプルコレクションの作成まず、ネストされたドキュメントを含むコレクションを作成しましょう。以下のコマンドでdemo607というコレクションにドキュメントを挿入します。> db.demo607.insertOne( ... { ... id: 1, ... Info1 : { ...

  2. MongoDBの埋め込みドキュメントから特定の要素を抽出する方法($unwind・$match・$projectの活用)

    MongoDBでは、配列形式の埋め込みドキュメントから特定の条件に合う要素だけを取り出したい場面がよくあります。そのような場合は、集計(Aggregation)パイプラインで $unwind、$match、$project を組み合わせることで、目的のデータを効率的に抽出できます。コレクションの作成とドキュメントの挿入まず、insertOne() メソッドを使って、学生情報を配列として持つコレクションを作成します。> db.demo744.insertOne( ... { ... studentInformation: ... [ ...