MongoDBで既存のレコード(ドキュメント)にフィールドを追加する方法
MongoDBでは、updateコマンドを使うことで、既存のレコード(ドキュメント)に新しいフィールドを追加できます。この記事では、実際のコマンド例を通じて、コレクション内のすべてのドキュメントへフィールドを一括追加する手順をわかりやすく解説します。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成します。ここでは「addAFieldToEveryRecordDemo」というコレクションに、クライアント情報のドキュメントを2件挿入します。
> db.addAFieldToEveryRecordDemo.insertOne({"ClientName":"Chris","ClientAge":34});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd00e32588d4a6447b2e061")
}
> db.addAFieldToEveryRecordDemo.insertOne({"ClientName":"Robert","ClientAge":36});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd00e59588d4a6447b2e062")
}
2. 挿入したドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.addAFieldToEveryRecordDemo.find().pretty();
実行結果は以下のとおりです。
{
"_id" : ObjectId("5cd00e32588d4a6447b2e061"),
"ClientName" : "Chris",
"ClientAge" : 34
}
{
"_id" : ObjectId("5cd00e59588d4a6447b2e062"),
"ClientName" : "Robert",
"ClientAge" : 36
}
3. すべてのレコードにフィールドを追加する
続いて、全レコードに対して「ClientDetails」というフィールドを追加します。ポイントは、update()の第4引数にtrueを指定し、「複数ドキュメント更新(multi)」を有効にすることです。
>db.addAFieldToEveryRecordDemo.update({},{$set:{"ClientDetails.ClientCountryName":""}},true,true);
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
update()メソッドの引数の意味
- 第1引数
{}:更新対象の検索条件。空オブジェクトを指定すると、すべてのドキュメントが対象になります。 - 第2引数
{$set: ...}:$set演算子で指定したフィールドを追加・更新します。ドット記法(ClientDetails.ClientCountryName)を使えば、ネストされたサブドキュメントも同時に作成できます。 - 第3引数
true:upsertオプション。該当ドキュメントが存在しない場合に新規作成するかどうかを指定します。 - 第4引数
true:multiオプション。trueにすることで、条件に一致したすべてのドキュメントが更新されます(省略時は最初の1件のみ)。
4. 追加結果の確認
もう一度find()を実行して、すべてのドキュメントに新しいフィールドが追加されたか確認してみましょう。
> db.addAFieldToEveryRecordDemo.find().pretty();
実行結果を見ると、各ドキュメントに「ClientDetails」フィールドが正しく追加されていることがわかります。
{
"_id" : ObjectId("5cd00e32588d4a6447b2e061"),
"ClientName" : "Chris",
"ClientAge" : 34,
"ClientDetails" : {
"ClientCountryName" : ""
}
}
{
"_id" : ObjectId("5cd00e59588d4a6447b2e062"),
"ClientName" : "Robert",
"ClientAge" : 36,
"ClientDetails" : {
"ClientCountryName" : ""
}
}
補足:MongoDB 3.2以降はupdateMany()の使用を推奨
MongoDB 3.2以降では、従来のupdate()メソッドは非推奨となり、代わりにupdateMany()やupdateOne()の使用が推奨されています。上記と同じ処理は、以下のようにすっきり書き換えられます。
db.addAFieldToEveryRecordDemo.updateMany(
{},
{ $set: { "ClientDetails.ClientCountryName": "" } }
);
updateMany()はデフォルトで一致したすべてのドキュメントを更新するため、multiオプションを意識する必要がなく、より直感的で安全なコードになります。新規開発ではこちらを採用しましょう。
-
既存のMongoDBドキュメントにリストやオブジェクト型のフィールドを追加する方法
既存のMongoDBドキュメントに、オブジェクト型や配列(リスト)型など特定のデータ型を持つ新しいフィールドを追加したい場合、$set 演算子を使用します。$set は指定したフィールドが存在しない場合は新しく作成し、すでに存在する場合は値を更新してくれるため、フィールドの追加にも最適です。1. コレクションとドキュメントの作成まず、insertOne() メソッドを使ってサンプルのコレクションを作成します。> db.demo732.insertOne({_id:1,Language:"English"}); { "acknowledged" :
-
MySQLで既存の値に数値を加算してフィールドを更新する方法
MySQLで既存の値に値を追加してフィールドを更新するには?MySQLでは、UPDATE文とSET句を組み合わせることで、既存の値に新しい値を加算しながらフィールドを更新できます。カウンター値やスコアなど、現在の値をもとに増減させたい場合に非常に便利なテクニックです。基本構文既存の値に整数を加算する場合、基本的な構文は以下のとおりです。UPDATE テーブル名 SET カラム名 = カラム名 + 加算する整数 WHERE 条件;ポイントは、SET句の右辺に同じカラム名を指定することです。これにより「現在の値 + 加算値」が計算され、その結果で上書きされます。サンプルテーブルの作成それでは、実際