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

MongoDBで特定のフィールドのみを更新する方法|$set演算子の使い方を解説

MongoDBでドキュメント全体を置き換えることなく、特定のフィールドだけを更新したい場合には、$set 演算子を使用します。$set を使うことで、指定したフィールドの値のみが変更され、それ以外のフィールドは元のまま保持されます。

この記事では、実際にサンプルコレクションを作成し、$set 演算子を使って特定のフィールドのみを更新する一連の手順を、実行結果とあわせてわかりやすく解説します。

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

まず、insertOne() メソッドを使って、複数のドキュメントを含むコレクションを作成します。

> db.updateOnlySpecificFieldDemo.insertOne({"EmployeeName":"John","EmployeeCountryName":"UK"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9ea849d628fa4220163b72")
}
> db.updateOnlySpecificFieldDemo.insertOne({"EmployeeName":"Larry","EmployeeCountryName":"US"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9ea853d628fa4220163b73")
}
> db.updateOnlySpecificFieldDemo.insertOne({"EmployeeName":"David","EmployeeCountryName":"AUS"});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9ea85bd628fa4220163b74")
}

これで、従業員名(EmployeeName)と国名(EmployeeCountryName)を持つ3件のドキュメントが登録されました。

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

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

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

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

{
    "_id" : ObjectId("5c9ea849d628fa4220163b72"),
    "EmployeeName" : "John",
    "EmployeeCountryName" : "UK"
}
{
    "_id" : ObjectId("5c9ea853d628fa4220163b73"),
    "EmployeeName" : "Larry",
    "EmployeeCountryName" : "US"
}
{
    "_id" : ObjectId("5c9ea85bd628fa4220163b74"),
    "EmployeeName" : "David",
    "EmployeeCountryName" : "AUS"
}

3. $set 演算子で特定のフィールドを更新する

続いて、_id が 5c9ea849d628fa4220163b72 のドキュメントを対象に、「EmployeeName」フィールドの値を「John」から「Robert」へ変更してみましょう。

> db.updateOnlySpecificFieldDemo.update({_id:ObjectId("5c9ea849d628fa4220163b72")},
... {$set: {"EmployeeName":"Robert"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

実行結果の WriteResult を見てみましょう。

  • nMatched : 1 … 条件に一致したドキュメントが1件あったことを示します
  • nModified : 1 … 実際に更新が適用されたドキュメントが1件であることを示します

これにより、更新処理が正常に完了したことが確認できます。

4. 更新後のデータを確認する

再度 find() メソッドを実行し、「EmployeeName」の値が正しく書き換えられているかチェックしましょう。

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

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

{
    "_id" : ObjectId("5c9ea849d628fa4220163b72"),
    "EmployeeName" : "Robert",
    "EmployeeCountryName" : "UK"
}
{
    "_id" : ObjectId("5c9ea853d628fa4220163b73"),
    "EmployeeName" : "Larry",
    "EmployeeCountryName" : "US"
}
{
    "_id" : ObjectId("5c9ea85bd628fa4220163b74"),
    "EmployeeName" : "David",
    "EmployeeCountryName" : "AUS"
}

上記の出力のとおり、対象ドキュメントの「EmployeeName」は「John」から「Robert」へ更新されています。一方で、「EmployeeCountryName」などの他のフィールドは一切変更されていません。これこそが、$set 演算子による部分更新の大きなメリットです。

補足:新しいバージョンでは updateOne() の使用を推奨

MongoDB 3.x 以降では、update() メソッドは非推奨(deprecated)となっており、代わりに updateOne()updateMany() の使用が推奨されています。同じ更新処理は、次のように記述できます。

db.updateOnlySpecificFieldDemo.updateOne(
   { _id: ObjectId("5c9ea849d628fa4220163b72") },
   { $set: { "EmployeeName": "Robert" } }
);

updateOne() は条件に一致した最初の1件のみを更新し、updateMany() は一致したすべてのドキュメントを更新します。新規開発ではこちらのメソッドを使うようにしましょう。

まとめ

  • 特定のフィールドのみを更新するには $set 演算子を使用する
  • $set を使えば、指定したフィールド以外のデータはそのまま保持される
  • WriteResult の nMatched / nModified で更新結果を確認できる
  • 最新のMongoDBでは updateOne() / updateMany() の使用が推奨されている
  1. MongoDBで特定のIDに一致する複数ドキュメントを一括更新する方法(updateMany活用ガイド)

    MongoDBのupdateMany()で特定IDのドキュメントをまとめて更新するMongoDBでは、updateMany()メソッドを使うことで、フィルター条件に一致するすべてのドキュメントを一度に更新できます。単一ドキュメントのみを対象とするupdateOne()とは異なり、複数件を効率的に処理したい場合に非常に便利です。ここでは、特定の_id(複数)に一致するドキュメントだけを選択的に更新する手順を、サンプルコードとともに解説します。1. サンプルコレクションの作成まず、insertOne()を使ってテスト用のコレクション「demo476」にドキュメントを作成します。> db.de

  2. MongoDBで特定のフィールド値のみを更新するクエリの書き方

    MongoDBでは、update()メソッドと$set演算子を組み合わせることで、ドキュメント全体を置き換えることなく、特定のフィールドの値だけを効率的に更新できます。本記事では、実際のコード例を通じて、その具体的な手順をわかりやすく解説します。 1. コレクションとドキュメントの作成 まずは例として、insertOne()メソッドを使って「demo557」というコレクションにドキュメントを挿入します。 > db.demo557.insertOne({Name:Chris}); { acknowledged : true, insertedId : ObjectId(5e8