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演算子を組み合わせれば、ドキュメント全体を書き換えることなく、必要な内部フィールドだけを効率的に更新できます。ネストが深い場合も「親.子.孫」の形で指定できるため、複雑なドキュメント構造でも柔軟に対応可能です。
-
MongoDBの$project演算子でフィールドを射影(プロジェクション)する方法
MongoDBの集計パイプライン(aggregation pipeline)において、ドキュメントから特定のフィールドを射影(プロジェクション)して出力形式を整形したい場合は、$project ステージを使用します。$project を使うと、表示するフィールドの選択だけでなく、$cond や $ifNull などの演算子を組み合わせて、条件に応じた値の変換や代替値の設定も可能です。この記事では、実際にコレクションを作成し、$project を使ってネストされたフィールドを条件付きで射影する方法を解説します。1. サンプルコレクションの作成まず、insertOne() メソッドを使って、ドキュ
-
MongoDBの_idフィールドを非表示にする方法
MongoDBの_idフィールドを非表示にする方法MongoDBでは、find()メソッドでドキュメントを検索すると、デフォルトで_idフィールド(ObjectId)が必ず結果に含まれます。しかし、射影(プロジェクション)という仕組みを使えば、この_idフィールドを非表示にし、必要なフィールドだけを取得することが可能です。本記事では、具体的な手順をサンプルコード付きで解説します。1. コレクションとドキュメントの作成まず、サンプル用のコレクションを作成し、ドキュメントを挿入します。> db.demo575.insertOne({id:101, Information:{Name:&quo