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

MongoDBで子オブジェクト(ネストされたドキュメント)を更新する方法|$set演算子とドット記法の使い方

MongoDBでドキュメント内にネストされた子オブジェクト(サブドキュメント)を更新したい場合、$set演算子とドット記法(dot notation)を組み合わせて使用します。この記事では、実際のコード例を通じて、子オブジェクトの特定のフィールドだけを安全に更新する手順を解説します。

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

まず、insertOne()メソッドを使って、子オブジェクトを持つドキュメントを含むコレクションを作成します。ここでは学生情報を管理する「demo21」というコレクションを例にします。

> db.demo21.insertOne({"StudentId":"STU-101","StudentDetails":{"StudentName":"Chris","StudentAge":21}});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e14be8922d07d3b95082e6f")
}

このドキュメントでは、「StudentDetails」というフィールドの中に「StudentName」と「StudentAge」がネストされた構造になっています。

2. 登録済みドキュメントの確認

find()メソッドにpretty()を組み合わせると、コレクション内のすべてのドキュメントを見やすい形式で表示できます。

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

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

{
    "_id" : ObjectId("5e14be8922d07d3b95082e6f"),
    "StudentId" : "STU-101",
    "StudentDetails" : {
        "StudentName" : "Chris",
        "StudentAge" : 21
    }
}

3. 子オブジェクトを更新するクエリ

子オブジェクトのフィールドを更新するには、$set演算子に対して「親フィールド名.子フィールド名」という形式のパスを指定します。次の例では、「StudentId」が「STU-101」のドキュメントを対象に、「StudentName」だけを「Robert」へ変更しています。

> db.demo21.update({"StudentId":'STU-101'},{$set:{'StudentDetails.StudentName':'Robert'}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

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

4. 更新結果の確認

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

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

以下の出力のように、「StudentName」だけが「Chris」から「Robert」に変更され、「StudentAge」などの他のフィールドはそのまま維持されていることがわかります。

{
    "_id" : ObjectId("5e14be8922d07d3b95082e6f"),
    "StudentId" : "STU-101",
    "StudentDetails" : {
        "StudentName" : "Robert",
        "StudentAge" : 21
    }
}

ポイントと補足

  • $setを使うメリット: 子オブジェクト全体を置き換えるのではなく、指定したフィールドのみを更新できるため、他のデータを誤って上書きするリスクを避けられます。
  • モダンな書き方: 古いupdate()メソッドの代わりに、現在のMongoDBではupdateOne()updateMany()の使用が推奨されています。上記のクエリは db.demo21.updateOne({"StudentId":"STU-101"},{$set:{"StudentDetails.StudentName":"Robert"}}) のように書き換え可能です。
  • より深いネスト構造: 3階層以上のネストされたフィールドも、「親.子.孫」のようにドット記法を連ねることで同様に更新できます。
  • 配列内の要素: 配列の中にあるオブジェクトを更新する場合は、位置演算子($や$[])を併用する必要があります。

このように、$setとドット記法を活用すれば、MongoDBのネストされた子オブジェクトでも必要な部分だけをピンポイントで効率的に更新できます。

  1. MongoDBでオブジェクトの配列を検索できますか?

    MongoDBでオブジェクト配列を検索する方法はい、MongoDBではオブジェクトの配列を検索することが可能です。集計パイプライン(aggregate())の中で$unwindを使って配列を展開し、$matchで条件に一致する要素を抽出します。ここでは、実際の手順をサンプルコードとともに解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne()メソッドを使って、オブジェクト配列を含むドキュメントをコレクションに登録します。> db.demo623.insertOne( ... { ... _id:1, ... details:

  2. MongoDBデータベースを削除(クリア)する方法【dropDatabase()の使い方】

    MongoDBでデータベース全体をクリア(削除)したい場合は、dropDatabase() メソッドを使用します。この記事では、実際のコマンド例とともに、データベースを削除する手順をわかりやすく解説します。dropDatabase() の基本構文データベースを削除するには、まず対象のデータベースに切り替えてから db.dropDatabase() を実行します。基本構文は以下の通りです。use yourDatabaseName; db.dropDatabase();注意: dropDatabase() を実行すると、そのデータベース内のコレクションやドキュメントはすべて完全に削除されます。この