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

MongoDBで複数のドキュメントを一括更新する方法|multiオプションとupdateMany()の使い方

MongoDBで条件に一致する複数のドキュメントを一度に更新したい場合、update()メソッドに multi: true オプションを指定します。このオプションを付けないと、デフォルトでは条件に一致した最初の1件しか更新されません。

本記事では、実際のコード例を使いながら、複数ドキュメントの一括更新手順をわかりやすく解説します。

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

まずは動作確認用のコレクションを作成し、ドキュメントを挿入していきます。ここではクライアント名と年齢を持つ「multiUpdateDemo」コレクションを使用します。

> db.multiUpdateDemo.insertOne({"ClientName":"John","ClientAge":29});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda5bc0b50a6c6dd317adc8")
}
> db.multiUpdateDemo.insertOne({"ClientName":"Carol","ClientAge":31});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda5bc1b50a6c6dd317adc9")
}
> db.multiUpdateDemo.insertOne({"ClientName":"John","ClientAge":39});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda5bc3b50a6c6dd317adca")
}
> db.multiUpdateDemo.insertOne({"ClientName":"John","ClientAge":41});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda5bc5b50a6c6dd317adcb")
}
> db.multiUpdateDemo.insertOne({"ClientName":"David","ClientAge":35});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cda5bc6b50a6c6dd317adcc")
}

この時点で、「John」という名前のドキュメントが3件登録されている状態です。

2. 登録済みドキュメントの確認

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

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

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

{
   "_id" : ObjectId("5cda5bc0b50a6c6dd317adc8"),
   "ClientName" : "John",
   "ClientAge" : 29
}
{
   "_id" : ObjectId("5cda5bc1b50a6c6dd317adc9"),
   "ClientName" : "Carol",
   "ClientAge" : 31
}
{
   "_id" : ObjectId("5cda5bc3b50a6c6dd317adca"),
   "ClientName" : "John",
   "ClientAge" : 39
}
{
   "_id" : ObjectId("5cda5bc5b50a6c6dd317adcb"),
   "ClientName" : "John",
   "ClientAge" : 41
}
{
   "_id" : ObjectId("5cda5bc6b50a6c6dd317adcc"),
   "ClientName" : "David",
   "ClientAge" : 35
}

3. multi: true を使った一括更新

それでは、ClientNameが「John」である3件のドキュメントに対して、ClientAgeを34に一括更新してみます。ポイントは第3引数に { multi: true } を指定することです。

> db.multiUpdateDemo.update({'ClientName': 'John'}, {$set: {'ClientAge': 34}}, {multi: true});
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })

実行結果の WriteResult を見ると、3件がマッチ(nMatched)し、3件が更新(nModified)されたことがわかります。

ポイント: multi: true を指定しない場合、条件に一致していても最初の1件のみが更新されます。複数件をまとめて更新したい場合は必ずこのオプションを付けてください。

4. 更新結果の確認

もう一度 find() メソッドで全ドキュメントを表示し、更新が反映されているか確認しましょう。

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

実行結果:

{
   "_id" : ObjectId("5cda5bc0b50a6c6dd317adc8"),
   "ClientName" : "John",
   "ClientAge" : 34
}
{
   "_id" : ObjectId("5cda5bc1b50a6c6dd317adc9"),
   "ClientName" : "Carol",
   "ClientAge" : 31
}
{
   "_id" : ObjectId("5cda5bc3b50a6c6dd317adca"),
   "ClientName" : "John",
   "ClientAge" : 34
}
{
   "_id" : ObjectId("5cda5bc5b50a6c6dd317adcb"),
   "ClientName" : "John",
   "ClientAge" : 34
}
{
   "_id" : ObjectId("5cda5bc6b50a6c6dd317adcc"),
   "ClientName" : "David",
   "ClientAge" : 35
}

「John」の3件すべての年齢が34に更新され、他のドキュメント(Carol・David)には影響がないことが確認できました。

補足:モダンな書き方 updateMany() の利用

MongoDB 3.2以降では、multi: true を使う代わりに、より直感的な updateMany() メソッドが推奨されています。同じ処理は以下のように書けます。

> db.multiUpdateDemo.updateMany(
...    { ClientName: 'John' },
...    { $set: { ClientAge: 34 } }
... );
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }

updateMany() は常に一致した全ドキュメントを更新するため、オプション指定ミスによる意図しない部分更新を防げる点で安全です。新規開発ではこちらの使用をおすすめします。

まとめ

  • MongoDBで複数ドキュメントを一括更新するには update(){ multi: true } を指定する
  • オプション未指定の場合は最初の1件のみ更新されるので注意
  • MongoDB 3.2以降なら updateMany() を使うのがシンプルで安全
  • 更新後は find() で結果を必ず確認しよう
  1. MongoDBで1つのクエリを使って複数のドキュメントを一括更新する方法(bulkWrite活用ガイド)

    MongoDBで1つのクエリで複数のドキュメントを更新するには?MongoDBで1回のリクエスト(1つのクエリ)で複数のドキュメントを効率的に更新したい場合は、bulkWrite()メソッドを使用します。bulkWrite()は、複数の書き込み操作(insert、update、deleteなど)をまとめてサーバーに送信できるため、個別にクエリを発行するよりもパフォーマンス面で優れています。ここでは、updateOne操作を組み合わせて、複数のドキュメントのフィールドを一度に更新する手順を具体的に解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne()メソッドを使って

  2. JavaでMongoDBコレクション内の複数のドキュメントを一括更新する方法

    MongoDBでは、updateMany()メソッドを使うことで、指定した条件に一致するコレクション内のすべてのドキュメントを一度に更新できます。1件だけを更新するupdateOne()とは異なり、フィルターに合致した全件が更新対象になる点が大きな特徴です。 基本構文 db.COLLECTION_NAME.updateMany(<filter>, <update>) Javaから利用する場合は、com.mongodb.client.MongoCollectionインターフェースが同名のupdateMany()メソッドを提供しています。第1引数に検索条件(フィルター)、第