Overview
このガイドでは、 Rubyドライバーを使用して update_one メソッドと update_many メソッドを使用してMongoDBコレクション内のドキュメントを更新する方法を学習できます。
サンプル データ
このガイドの例では、Atlasサンプルデータセット の sample_restaurantsデータベースの restaurantsコレクションを使用します。Rubyアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続する Mongo::Clientオブジェクトを作成し、次の値を database 変数と collection 変数に割り当てます。
database = client.use('sample_restaurants') collection = database[:restaurants]
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、MongoDBを使い始めるガイドを参照してください。
アップデート操作
次の方法を使用して、MongoDB 内のドキュメントを更新できます。
update_one: 検索条件に一致する最初のドキュメントを更新しますupdate_many: 検索条件に一致するすべてのドキュメントを更新します
各更新方法には次のパラメーターが必要です。
1 つのドキュメントの更新例
次の例では、update_one メソッドを使用して、nameフィールドの値が "Happy Garden" である最初のドキュメントを検索します。次に、$set 演算子を使用して nameフィールドの値を "Mountain House" に更新します。
filter = { name: 'Happy Garden' } update = { '$set' => { name: 'Mountain House' } } single_result = collection.update_one(filter, update) puts "#{single_result.modified_count} document(s) updated."
1 document(s) updated
多数のドキュメントの更新例
次の例では、update_many メソッドを使用して、nameフィールドの値が "Starbucks" であるすべてのドキュメントを更新します。アップデートドキュメントでは、$rename 演算子を使用して、addressフィールドの名前を location に変更します。
filter = { name: 'Starbucks' } update = { '$rename' => { address: 'location' } } many_result = collection.update_many(filter, update) puts "#{many_result.modified_count} document(s) updated."
11 document(s) updated
アップサート オプション
upsert パラメーターを使用すると、update_one() 操作と update_many() 操作を使用して 条件付き操作を実行できます。
指定されたドキュメントが存在する場合、 コマンドはそれを更新します。
指定されたドキュメントが存在しない場合、コマンドは指定されたパラメーターを持つ新しいドキュメントを作成します。
詳細については、「更新の例の変更」セクションまたはこのページのオプション テーブルを参照してください。
更新操作をカスタマイズする
update_one メソッドと update_many メソッドは、 更新操作を構成するための オプションを受け入れます。これらのオプションをパラメーターとして個別に渡すことも、オプションを含む Hashオブジェクトを作成し、そのオブジェクトをパラメーターとして渡すこともできます。オプションを指定しない場合、ドライバーはデフォルト設定で更新操作を実行します。
次の表では、更新操作を構成するために使用できるオプションについて説明します。
オプション | 説明 |
|---|---|
| クエリフィルターに一致するドキュメントがない場合に、更新操作でアップサート操作を実行するかどうか。詳細については、MongoDB Server マニュアルのアップサートステートメントを参照してください。 |
| 更新操作がドキュメント検証をバイパスするかどうか。これにより、スキーマ検証要件を満たしていないドキュメントを更新できます(存在する場合)。スキーマ検証の詳細については、MongoDB Server マニュアルの「スキーマ検証」を参照してください。 |
| 結果をソートするときに使用する言語照合。詳細については、MongoDB Server マニュアルの 照合 を参照してください。 |
| 更新が適用される配列要素を選択するために指定するフィルターのリスト。 |
| ドキュメントを照合する際に使用するインデックス。詳細については、 MongoDB Serverマニュアルの ヒントステートメント を参照してください。 |
| 操作のトップレベル変数を設定するためのパラメータ名と値のマップ。値は、ドキュメントフィールドを参照しない定数または閉じた式である必要があります。詳細については、MongoDB Server マニュアルの「let ステートメント」を参照してください。 |
変更更新の例
この例では、$equal 演算子を使用して、nameフィールドの値が "Sunrise Pizzeria" であるドキュメントを一致させます。次に、$set 演算子を使用して、最初に一致するドキュメントの boroughフィールド値を "Queens" に設定し、cuisineフィールド値を "Italian" に設定します。
upsert オプションが true に設定されているため、クエリフィルターが既存のドキュメントと一致しない場合、ドライバーはフィルターと更新ドキュメントのフィールドと値を含む新しいドキュメントを挿入します。
filter = { 'name' => 'Sunrise Pizzeria' } update = { '$set' => { borough: 'Queens', cuisine: 'Italian' } } upsert_result = collection.update_one(filter, update, upsert: true) puts "#{upsert_result.modified_count} document(s) updated."
1 document(s) updated
戻り値
update_one メソッドと update_many メソッドはそれぞれ Resultオブジェクトを返します。Resultインスタンスから次のメソッドにアクセスできます。
方式 | 説明 |
|---|---|
| 更新された回数に関わらず、クエリフィルターに一致したドキュメントの数。 |
| 更新操作によって変更されたドキュメントの数。更新されたドキュメントがオリジナルと同一である場合、この数には含まれません。 |
| サーバーが結果を確認した場合は |
| ドライバーがアップサートを実行した場合は、データベース内でアップサートされたドキュメントの数が返されます。 |
| ドライバーがアップサートを実行した場合、データベースでアップサートされたドキュメントの |
Tip
他の Result メソッドを呼び出す前に、acknowledged? メソッドの値を確認してください。acknowledged? メソッドが false を返す場合、Resultオブジェクトで他のメソッドを呼び出すと、ドライバーは InvalidOperation 例外をスローします。サーバーが書込み (write)操作を確認しない場合、ドライバーはこれらの値を決定できません。
詳細情報
Rubyドライバーを使用してドキュメントを更新する方法を示す実行可能なコード例については、ドキュメントの挿入を参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。