MongoDBでサブドキュメントにフィールドを追加する方法【update()と$setの使い方】
MongoDBでは、update()メソッドと$set演算子を組み合わせることで、既存のサブドキュメント(配列内の要素)に新しいフィールドを簡単に追加できます。この記事では、実際のコード例を使いながら、その手順をわかりやすく解説します。
1. サンプルコレクションの作成
まずは、ドキュメントを含むコレクションを作成しましょう。ここではinsertOne()メソッドを使用して、配列形式のサブドキュメントを持つデータを挿入します。
> db.addExtraFieldDemo.insertOne(
{
"_id": 1,
"UserName": "Larry",
"UserOtherDetails": [
{
"UserCountryName": "US",
"UserAge": 23
},
{
"UserCountryName": "UK",
"UserAge": 24
}
]
}
);
{ "acknowledged" : true, "insertedId" : 1 }
UserOtherDetailsフィールドはオブジェクトの配列になっており、各要素がサブドキュメントとして扱われます。この配列内の各サブドキュメントに対して、後ほど新しいフィールドを追加していきます。
2. 作成したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.addExtraFieldDemo.find().pretty();
実行すると、以下のような出力が得られます。
{
"_id" : 1,
"UserName" : "Larry",
"UserOtherDetails" : [
{
"UserCountryName" : "US",
"UserAge" : 23
},
{
"UserCountryName" : "UK",
"UserAge" : 24
}
]
}
3. サブドキュメントへのフィールド追加
それでは、サブドキュメントに新しいフィールドを追加するクエリを見ていきましょう。ポイントは、パスの指定方法です。UserOtherDetails.0.isMarried_のように、配列のインデックス番号(0から始まる)を指定することで、特定のサブドキュメントを対象にできます。
> db.addExtraFieldDemo.update({ "_id":1 },{ "$set": { "UserOtherDetails.0.isMarried_" : true }});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
このクエリの意味は次のとおりです。
{ "_id": 1 }:更新対象のドキュメントを指定する条件$set:指定したフィールドを追加・更新する演算子UserOtherDetails.0.isMarried_:UserOtherDetails配列の0番目(最初)のサブドキュメントにisMarried_フィールドを追加
実行結果のnModified : 1は、1件のドキュメントが正常に更新されたことを示しています。
4. 更新結果の確認
もう一度ドキュメントを表示して、フィールドが正しく追加されたか確認してみましょう。
> db.addExtraFieldDemo.find().pretty();
実行すると、以下の出力が得られます。
{
"_id" : 1,
"UserName" : "Larry",
"UserOtherDetails" : [
{
"UserCountryName" : "US",
"UserAge" : 23,
"isMarried_" : true
},
{
"UserCountryName" : "UK",
"UserAge" : 24
}
]
}
0番目のサブドキュメントにisMarried_ : trueという新しいフィールドが追加されていることが確認できました。一方、1番目のサブドキュメントには影響していません。
まとめ
MongoDBでサブドキュメントにフィールドを追加するには、update()メソッドの$set演算子を使い、「フィールド名.インデックス.追加したいフィールド名」という形式でパスを指定します。なお、モダンなMongoDB(4.2以降)ではupdateOne()やupdateMany()の使用が推奨されており、同じ構文で同様の操作が可能です。また、配列内のすべての要素に一括でフィールドを追加したい場合は、$[](all positional operator)を活用すると便利です。
-
MongoDBでドキュメントフィールドの値から別の値(TotalPrice − Discount)を差し引いて計算する方法
MongoDBでは、aggregate()内の $subtract 演算子を使うことで、ドキュメントフィールドの値から別のフィールドの値を差し引いた結果を計算できます。例えば、総額(TotalPrice)から割引額(DiscountPrice)を引いた実質価格を求めるようなケースに便利です。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下のコマンドでコレクションにドキュメントを挿入します。> db.demo599.insertOne({TotalPrice:250,DiscountPrice:35});{ ackno
-
既存のMongoDBドキュメントにリストやオブジェクト型のフィールドを追加する方法
既存のMongoDBドキュメントに、オブジェクト型や配列(リスト)型など特定のデータ型を持つ新しいフィールドを追加したい場合、$set 演算子を使用します。$set は指定したフィールドが存在しない場合は新しく作成し、すでに存在する場合は値を更新してくれるため、フィールドの追加にも最適です。1. コレクションとドキュメントの作成まず、insertOne() メソッドを使ってサンプルのコレクションを作成します。> db.demo732.insertOne({_id:1,Language:"English"}); { "acknowledged" :