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

MongoDBでネストされた内部フィールドを更新する方法【$set演算子とドット記法】

MongoDBでは、ドキュメント内にネストされた内部フィールド(サブドキュメントのフィールド)も簡単に更新できます。ポイントはドット記法(ドット・ノーテーション)$set演算子を組み合わせることです。

内部フィールドを更新する基本構文

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

「外側のフィールド名.内側のフィールド名」のようにドット(.)でつなぐことで、ネストされたフィールドをピンポイントで指定できます。

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

まず、ネストされたドキュメントを含むコレクションを作成しましょう。

> db.updateDocumentDemo.insertOne(
...   {
...       "StudentDetails" : {
...         "StudentFirstName" : "Adam",
...         "StudentLastName" : "Samith"
...     },
...     "StudentOtherDetails" : {
...         "StudentFavouriteSubject" : "MySQL",
...         "StudentScore" : 45
...     }
...   }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd50bb32cba06f46efe9efe")
}

登録されたドキュメントの確認

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

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

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

{
    "_id" : ObjectId("5cd50bb32cba06f46efe9efe"),
    "StudentDetails" : {
        "StudentFirstName" : "Adam",
        "StudentLastName" : "Samith"
    },
    "StudentOtherDetails" : {
        "StudentFavouriteSubject" : "MySQL",
        "StudentScore" : 45
    }
}

内部フィールドを更新するクエリ

ここでは、「StudentOtherDetails」内の「StudentFavouriteSubject」を「MySQL」から「MongoDB」に変更します。

> db.updateDocumentDemo.update({"_id" : ObjectId("5cd50bb32cba06f46efe9efe")},
... {$set : {"StudentOtherDetails.StudentFavouriteSubject" :"MongoDB"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

WriteResultに「nModified : 1」と表示されていれば、1件のドキュメントが正常に更新されています。

更新後のドキュメントを再確認

もう一度ドキュメントを表示して、更新が正しく反映されているか確認しましょう。

> db.updateDocumentDemo.find().pretty();
{
    "_id" : ObjectId("5cd50bb32cba06f46efe9efe"),
    "StudentDetails" : {
        "StudentFirstName" : "Adam",
        "StudentLastName" : "Samith"
    },
    "StudentOtherDetails" : {
        "StudentFavouriteSubject" : "MongoDB",
        "StudentScore" : 45
    }
}

「StudentFavouriteSubject」が「MongoDB」に変更され、他のフィールドには影響を与えることなく、内部フィールドだけが更新されたことがわかります。

補足:モダンな書き方(updateOneの活用)

MongoDB 3.x以降では、update()の代わりにupdateOne()やupdateMany()の使用が推奨されています。同じ更新は以下のように記述できます。

db.updateDocumentDemo.updateOne(
  { "_id" : ObjectId("5cd50bb32cba06f46efe9efe") },
  { $set : { "StudentOtherDetails.StudentFavouriteSubject" : "MongoDB" } }
);

このように、ドット記法と$set演算子を組み合わせれば、ドキュメント全体を書き換えることなく、必要な内部フィールドだけを効率的に更新できます。ネストが深い場合も「親.子.孫」の形で指定できるため、複雑なドキュメント構造でも柔軟に対応可能です。

  1. MongoDBの$project演算子でフィールドを射影(プロジェクション)する方法

    MongoDBの集計パイプライン(aggregation pipeline)において、ドキュメントから特定のフィールドを射影(プロジェクション)して出力形式を整形したい場合は、$project ステージを使用します。$project を使うと、表示するフィールドの選択だけでなく、$cond や $ifNull などの演算子を組み合わせて、条件に応じた値の変換や代替値の設定も可能です。この記事では、実際にコレクションを作成し、$project を使ってネストされたフィールドを条件付きで射影する方法を解説します。1. サンプルコレクションの作成まず、insertOne() メソッドを使って、ドキュ

  2. MongoDBの_idフィールドを非表示にする方法

    MongoDBの_idフィールドを非表示にする方法MongoDBでは、find()メソッドでドキュメントを検索すると、デフォルトで_idフィールド(ObjectId)が必ず結果に含まれます。しかし、射影(プロジェクション)という仕組みを使えば、この_idフィールドを非表示にし、必要なフィールドだけを取得することが可能です。本記事では、具体的な手順をサンプルコード付きで解説します。1. コレクションとドキュメントの作成まず、サンプル用のコレクションを作成し、ドキュメントを挿入します。> db.demo575.insertOne({id:101, Information:{Name:&quo