Overview
このガイドでは、 C++ドライバーを使用してMongoDBコレクション内のドキュメントを更新する方法を学習できます。 単一のドキュメントを更新するにはupdate_one()メソッドを、複数のドキュメントを更新するにはupdate_many()メソッドを呼び出します。
サンプル データ
このガイドの例では、 Atlasサンプルデータセットのsample_restaurantsデータベースのrestaurantsコレクションを使用します。 C++アプリケーションからこのコレクションにアクセスするには、Atlasmongocxx::client クラスターに接続する をインスタンス化し、次の値をdb 変数とcollection 変数に割り当てます。
auto db = client["sample_restaurants"]; auto collection = db["restaurants"];
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、MongoDBを使い始めるガイドを参照してください。
アップデート操作
MongoDB では、次の方法で更新操作を実行できます。
update_one()は、検索条件に一致する最初のドキュメントを更新します。update_many()は、検索条件に一致するすべてのドキュメントを更新します
各更新方法には次のパラメーターが必要です。
クエリフィルタードキュメント: 更新するドキュメントを指定します。 クエリフィルターの詳細については、 MongoDB Serverマニュアルの「クエリフィルター ドキュメント 」セクションを参照してください。
ドキュメントの更新:更新演算子、または実行する更新の種類と、変更するフィールドと値を指定します。 更新演算子とその使用方法のリストについては、 MongoDB Serverマニュアルの「フィールド更新演算子 」のガイドを参照してください。
1 つのドキュメントの更新
次の例では、 update_one()メソッドを使用して、 restaurantsコレクション内のドキュメントのname値を"Bagels N Buns"から"2 Bagels 2 Buns"に更新します。
auto query_filter = make_document(kvp("name", "Bagels N Buns")); auto update_doc = make_document(kvp("$set", make_document(kvp("name", "2 Bagels 2 Buns")))); auto result = collection.update_one(query_filter.view(), update_doc.view());
多くのドキュメントの更新
次の例では、 update_many()メソッドを使用して、 cuisineの値が"Pizza"であるすべてのドキュメントを更新します。 更新後、ドキュメントのcuisine値は"Pasta"になります。
auto query_filter = make_document(kvp("cuisine", "Pizza")); auto update_doc = make_document(kvp("$set", make_document(kvp("cuisine", "Pasta")))); auto result = collection.update_many(query_filter.view(), update_doc.view());
更新操作をカスタマイズする
mongocxx::options::updateクラスのインスタンスを任意のパラメータとして渡すことで、 update_one()メソッドとupdate_many()メソッドの動作を変更できます。 次の表では、 mongocxx::options::updateインスタンスに設定できるフィールドを説明しています。
フィールド | 説明 |
|---|---|
| クエリフィルターに一致するドキュメントがない場合は、更新操作でアップサート操作を実行するかどうかを指定します。詳細については、 MongoDB Serverマニュアルの アップサート ステートメント を参照してください。デフォルトは |
| アップデート操作がドキュメント検証をバイパスするかどうかを指定します。これにより、スキーマ検証要件を満たさないドキュメントを更新することができます(存在する場合)。スキーマ検証の詳細については、 MongoDB Serverマニュアルの「 スキーマバリデーション 」を参照してください。デフォルトは |
| 結果をソートするときに使用する言語照合の種類を指定します。 詳細については、MongoDB Server マニュアルの 「照合」 を参照してください。 |
| 操作で配列フィールドが変更される場合に、アップデートを適用する配列要素を指定します。 |
| ドキュメントをスキャンするインデックスを設定します。 詳細については、 MongoDB Serverマニュアルの ヒント ステートメントを参照してください。 |
| 操作の書込み保証 (write concern)を設定します。 詳細については、 MongoDB Serverマニュアルの「 書込み保証 」を参照してください。 |
| 操作の読みやすさを向上させるために、 の値のリストを含むドキュメントを指定します。 値は、ドキュメントフィールドを参照しない定数または閉じた式である必要があります。 詳細については、 MongoDB Serverマニュアルの let ステートメントを参照してください。 |
| 操作に添付するコメント。 詳細については、MongoDB Server マニュアルの 「挿入コマンド フィールドガイド」 を参照してください。 |
次の例では、 update_many()メソッドを使用して、 boroughの値が"Manhattan"であるすべてのドキュメントを検索します。 次に、これらのドキュメントのborough値を"Manhattan (north)"にアップデートします。 upsertオプションがtrueに設定されているため、クエリフィルターが既存のドキュメントと一致しない場合、 C++ドライバーは新しいドキュメントを挿入します。
mongocxx::options::update opts{}; opts.upsert(true); auto query_filter = make_document(kvp("borough", "Manhattan")); auto update_doc = make_document(kvp("$set", make_document(kvp("borough", "Manhattan (north)")))); auto result = collection.update_many(query_filter.view(), update_doc.view(), opts);
戻り値
update_one()メソッドとupdate_many()メソッドはmongocxx::result::updateクラスのインスタンスを返します。 このクラスには、次のメンバー関数が含まれています。
関数 | 説明 |
|---|---|
| アップデートされた数に関係なく、クエリフィルターに一致したドキュメントの数を返します。 |
| 更新操作によって変更されたドキュメントの数を返します。 更新されたドキュメントが元と同一の場合、このカウントには含まれません。 |
| 操作の未加工の結果ドキュメントを返します。 |
| データベースにアップサートされたドキュメントの数を返します。 |
| ドライバーがアップサートを実行した場合、データベースでアップサートされたドキュメントのIDを返します。 |
次の例では、 update_many()メソッドを使用して、一致するドキュメントのnameフィールドを"Dunkin' Donuts"から"Dunkin'"にアップデートします。 変更されたドキュメントの数を出力するには、 modified_count()メンバー関数を呼び出します。
auto query_filter = make_document(kvp("name", "Dunkin' Donuts")); auto update_doc = make_document(kvp("$set", make_document(kvp("name", "Dunkin'")))); auto result = collection.update_many(query_filter.view(), update_doc.view()); std::cout << "Modified documents: " << result->modified_count() << std::endl;
Modified documents: 206
詳細情報
クエリフィルターの作成の詳細については、「クエリの指定」ガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。