AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

Update Documents

このガイドでは、 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: 検索条件に一致するすべてのドキュメントを更新します

各更新方法には次のパラメーターが必要です。

  • クエリフィルター。アップデートするドキュメントに一致します。クエリフィルターの詳細については、「 クエリの指定 」ガイドを参照してください。

  • ドキュメント を更新し、更新演算子と更新するフィールドと値を指定します。更新演算子は、実行する更新のタイプを指定します。 更新演算子のリストを表示し、その使用方法については、 MongoDB Serverマニュアルの「 フィールド更新演算子 」のガイドページを参照してください。

次の例では、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オブジェクトを作成し、そのオブジェクトをパラメーターとして渡すこともできます。オプションを指定しない場合、ドライバーはデフォルト設定で更新操作を実行します。

次の表では、更新操作を構成するために使用できるオプションについて説明します。

オプション
説明

upsert

クエリフィルターに一致するドキュメントがない場合に、更新操作でアップサート操作を実行するかどうか。詳細については、MongoDB Server マニュアルのアップサートステートメントを参照してください。
デフォルト: false

bypass_document_validation

更新操作がドキュメント検証をバイパスするかどうか。これにより、スキーマ検証要件を満たしていないドキュメントを更新できます(存在する場合)。スキーマ検証の詳細については、MongoDB Server マニュアルの「スキーマ検証」を参照してください。
デフォルト: false

collation

結果をソートするときに使用する言語照合。詳細については、MongoDB Server マニュアルの 照合 を参照してください。

array_filters

更新が適用される配列要素を選択するために指定するフィルターのリスト。

hint

ドキュメントを照合する際に使用するインデックス。詳細については、 MongoDB Serverマニュアルの ヒントステートメント を参照してください。

let

操作のトップレベル変数を設定するためのパラメータ名と値のマップ。値は、ドキュメントフィールドを参照しない定数または閉じた式である必要があります。詳細については、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インスタンスから次のメソッドにアクセスできます。

方式
説明

matched_count

更新された回数に関わらず、クエリフィルターに一致したドキュメントの数。

modified_count

更新操作によって変更されたドキュメントの数。更新されたドキュメントがオリジナルと同一である場合、この数には含まれません。

acknowledged?

サーバーが結果を確認した場合は true を返します。

upserted_count

ドライバーがアップサートを実行した場合は、データベース内でアップサートされたドキュメントの数が返されます。

upserted_ids

ドライバーがアップサートを実行した場合、データベースでアップサートされたドキュメントの _id 値を返します。

Tip

他の Result メソッドを呼び出す前に、acknowledged? メソッドの値を確認してください。acknowledged? メソッドが false を返す場合、Resultオブジェクトで他のメソッドを呼び出すと、ドライバーは InvalidOperation 例外をスローします。サーバーが書込み (write)操作を確認しない場合、ドライバーはこれらの値を決定できません。

Rubyドライバーを使用してドキュメントを更新する方法を示す実行可能なコード例については、ドキュメントの挿入を参照してください。

このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。