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

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

MongoDBでは、入れ子(ネスト)になったサブドキュメントのフィールドを更新する際、update()メソッドとドット表記(dot notation)を組み合わせて使用します。ドット表記を使うことで、深い階層にあるフィールドを直接指定して値を変更できます。

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

まず、ネストされたドキュメントを含むコレクションを作成しましょう。以下のコマンドでdemo607というコレクションにドキュメントを挿入します。

> db.demo607.insertOne(
...     {
...        id: 1,
...        "Info1" : {
...           "Name" : "Chris",
...           "Age" : 21,
...
...           "Info2" : {
...              "SubjectName" : "MongoDB",
...              "Marks" : 89
...           }
...        }
...     }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e9742a5f57d0dc0b182d62a")
}

2. 挿入したドキュメントの確認

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

> db.demo607.find();

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

{ "_id" : ObjectId("5e9742a5f57d0dc0b182d62a"), "id" : 1, "Info1" :
    { "Name" : "Chris", "Age" : 21, "Info2" : { "SubjectName" : "MongoDB", "Marks" : 89 } } 
}

3. ネストされたドキュメントを更新するクエリ

ここからが本題です。ネストされたフィールドを更新するには、$set演算子とドット表記を組み合わせます。この例では、第2階層にあるInfo2.Marksの値を「89」から「90」に変更します。

> db.demo607.update({id:1},{$set:{"Info1.Info2.Marks":90}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

ポイント:

  • {id:1} … 更新対象のドキュメントを特定する条件(クエリ)です。
  • $set … 指定したフィールドだけを更新するための更新演算子です。これを使わないとドキュメント全体が置き換わってしまうので注意が必要です。
  • "Info1.Info2.Marks" … ドット表記により、階層のパスを左から順に指定しています。
  • nModified : 1 … 1件のドキュメントが正常に更新されたことを示します。

4. 更新結果の確認

再度find()を実行し、今度はpretty()を付けて見やすく整形して表示してみましょう。

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

実行すると、次の出力が得られます。Marksの値が「90」に更新されていることが確認できます。

{
    "_id" : ObjectId("5e9742a5f57d0dc0b182d62a"),
    "id" : 1,
    "Info1" : {
        "Name" : "Chris",
        "Age" : 21,
        "Info2" : {
            "SubjectName" : "MongoDB",
            "Marks" : 90
        }
    }
}

補足:update()とupdateOne()について

上記の例で使用しているupdate()は旧来のメソッドで、現在は非推奨(deprecated)となっています。最新のMongoDBでは、条件に一致する最初の1件のみを更新するupdateOne()、または一致するすべてのドキュメントを更新するupdateMany()の使用が推奨されています。書き方はほぼ同じで、次のように置き換えることができます。

> db.demo607.updateOne({id:1},{$set:{"Info1.Info2.Marks":90}})

このように、ドット表記と$set演算子を組み合わせれば、どれほど深くネストされたフィールドでも簡単かつ安全に更新することが可能です。

  1. MongoDBのfind()クエリでネストされたドキュメントを取得する方法

    MongoDBでネストされたドキュメント(入れ子になったサブドキュメントや配列内のオブジェクト)から値を取得するには、「ドット表記(dot notation)」を使用します。この記事では、サンプルコレクションを作成し、find()クエリを使ってネストされたデータを検索する具体的な手順を解説します。 サンプルコレクションの作成 まず、insert()メソッドを使ってドキュメントを含むコレクションを作成しましょう。 > db.demo591.insert([ ... { "Name": "John", "Age": 23 },

  2. MongoDBでネストされたドキュメントを更新する方法|位置演算子$を使った配列要素の更新手順

    MongoDBでは、ドキュメント内の配列に格納されたネストされた(入れ子の)ドキュメントも、位置演算子「$」を使うことで効率的に更新できます。この記事では、実際のコード例を通じて、配列内の特定のサブドキュメントを更新する手順をわかりやすく解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使用して、ネストされたドキュメントを含むコレクションを作成します。ここでは「Information」というフィールドに、複数のサブドキュメントを持つ配列を格納しています。 > db.demo595.insertOne( { Information: [ { _i