ドキュメントの変更
項目一覧
Overview
このガイドでは、アップデート操作と置換操作を使用して MongoDB 内のドキュメントを変更する方法を学習できます。
更新操作では、指定したフィールドが変更されますが、他のフィールドと値は変更されません。 置き換え操作により、 _id
フィールドを除くドキュメントのすべての既存のフィールドが削除され、削除されたフィールドは新しいフィールドと値に置き換えられます。
このガイドには、次のセクションが含まれています。
「ドキュメントの更新」では、ドライバーを使用して更新操作を実行する方法について説明します
「ドキュメントの置き換え」では、ドライバーを使用して置換操作を実行する方法について説明します。
「更新と置換の動作を変更する 」では、このガイドで説明されているメソッドのデフォルトの動作を変更する方法について説明します。
追加情報では、このガイドで言及されている型とメソッドのリソースとAPIドキュメントへのリンクを提供します
ドキュメントパターンの更新
MongoDB では、ドキュメントを変更するためのすべての方法は同じパターンに従います。
注意
changeX()
はプレースホルダーであり、実際のメソッドではありません。
これらのメソッドは、次のパラメーターを取ります。
変更する 1 つ以上のドキュメントに一致するクエリフィルター
フィールドと値の変更を指定する 更新ドキュメント
Rust ドライバーは、ドキュメントを変更するための次のメソッドを提供します。
update_one()
update_many()
replace_one()
複合操作を使用すると、1 回のアクションでデータを検索して変更できます。 詳しくは、 複合演算子 に関するガイドをご覧ください。
_id フィールド
MongoDB コレクション内の各ドキュメントには、一意かつ不変の_id
フィールドがあります。 更新操作または置換操作を通じて_id
フィールドを変更しようとすると、ドライバーはWriteError
を発生させ、更新を実行しません。
Update Documents
次の方法で更新操作を実行できます。
update_one()
は、検索条件に一致する最初のドキュメントを更新します。update_many()
は、検索条件に一致するすべてのドキュメントを更新します
これらの更新操作メソッドにオプション ビルダのメソッドを連鎖させることもできます。 更新メソッドの動作の変更の詳細については、このガイドの「更新と置換の動作の変更 」セクションを参照してください。
パラメーター
各メソッドは、クエリフィルターと、少なくとも 1 つの更新演算子を含む更新ドキュメントを受け取ります。 更新演算子は、実行する更新のタイプを指定し、変更を説明するフィールドと値を含めます。 更新ドキュメントは、次の形式を使用します。
doc! { "<update operator>": doc! { "<field>": <value> } }
1 つの更新ドキュメントで複数の更新を指定するには、次の形式を使用します。
doc! { "<update operator>": doc!{"<field>": <value>}, "<update operator>": doc!{"<field>": <value>}, ... }
更新演算子と説明の完全なリストについては、MongoDB サーバーのマニュアルを参照してください。
注意
更新操作における集計パイプライン
MongoDB Server バージョン4.2以降を使用している場合は、更新操作で集計パイプラインを使用できます。 MongoDB が集計パイプラインでサポートする集計ステージの詳細については、 集計パイプラインを使用して更新を実行するに関するチュートリアル を参照してください。
戻り値
操作が成功した場合、 update_one()
メソッドとupdate_many()
メソッドはUpdateResult
タイプを返します。 UpdateResult
型には、操作を記述する次のプロパティが含まれています。
プロパティ | 説明 |
---|---|
| フィルターに一致するドキュメントの数 |
| 操作によって変更されたドキュメントの数 |
| アップサートされたドキュメントの |
UpdateOne()
に渡すクエリフィルターに一致するドキュメントが複数ある場合、メソッドは最初に一致したドキュメントを選択してアップデートします。 クエリフィルターに一致するドキュメントがない場合、アップデート操作では変更は行われません。
更新例
次のドキュメントは、会社の従業員について説明しています。
{ "_id": ObjectId('4337'), "name": "Shelley Olson", "department": "Marketing", "role": "Director", "bonus": 3000 }, { "_id": ObjectId('4902'), "name": "Remi Ibrahim", "department": "Marketing", "role": "Consultant", "bonus": 1800 }
この例では、 update_many()
メソッドを使用してアップデート操作を実行しています。 update_many()
メソッドは次のパラメータを取ります。
department
フィールドの値が"Marketing"
であるドキュメントを一致させるクエリフィルター次の更新を含む更新ドキュメント。
department
の値を"Business Operations"
に、role
の値を"Analytics Specialist"
に変更する$set
演算子bonus
の値を500
増やす$inc
演算子
let update_doc = doc! { "$set": doc! { "department": "Business Operations", "role": "Analytics Specialist" }, "$inc": doc! { "bonus": 500 } }; let res = my_coll .update_many(doc! { "department": "Marketing" }, update_doc) .await?; println!("Modified documents: {}", res.modified_count);
Modified documents: 2
次のドキュメントは、前回の更新操作によって発生した変更を反映しています。
{ "_id": ObjectId('4337'), "name": "Shelley Olson", "department": "Business Operations", "role": "Analytics Specialist", "bonus": 3500 }, { "_id": ObjectId('4902'), "name": "Remi Ibrahim", "department": "Business Operations", "role": "Analytics Specialist", "bonus": 2300 }
ObjectId による更新の例
次のドキュメントでは、会社の従業員について説明しています。
{ "_id": ObjectId('4274'), "name": "Jill Millerton", "department": "Marketing", "role": "Consultant" }
この例では、ドキュメントの一意の_id
値に一致するクエリフィルターを指定して、前述のドキュメントをクエリします。 次に、コードはupdate_one()
メソッドを使用して更新操作を実行します。 update_one()
メソッドは次のパラメータを取ります。
_id
フィールドの値がObjectId('4274')
であるドキュメントに一致するクエリフィルターname
の値を"Jill Gillison"
に設定する手順を作成する更新ドキュメント
let id = ObjectId::from_str("4274").expect("Could not convert to ObjectId"); let filter_doc = doc! { "_id": id }; let update_doc = doc! { "$set": doc! { "name": "Jill Gillison" } }; let res = my_coll .update_one(filter_doc, update_doc) .await?; println!("Modified documents: {}", res.modified_count);
Modified documents: 1
次のドキュメントには、前述の更新操作によって発生した変更が反映されています。
{ "_id": ObjectId('4274'), "name": "Jill Gillison", "department": "Marketing", "role": "Consultant" }
Tip
_id
フィールドの詳細については、このページの 「 _id フィールド」セクション 、またはサーバー マニュアルのObjectId()メソッドのドキュメント を参照してください。
ドキュメントの置き換え
replace_one()
メソッドを使用して置換操作を実行できます。 このメソッドは、 _id
フィールドを除くドキュメントの既存のフィールドをすべて指定した新しいフィールドと値に置き換えます。
オプション ビルダのメソッドを置換操作メソッドに連鎖させることもできます。 replace_one()
メソッドの動作の変更の詳細については、このガイドの「更新と置換の動作の変更 」セクションを参照してください。
パラメーター
replace_one()
メソッドはクエリフィルターと置換ドキュメントを受け取ります。このドキュメントには、既存のドキュメントを置き換えるフィールドと値が含まれます。 置換ドキュメントは以下の形式を使用します。
doc! { "<field>": <value>, "<field>": <value>, ... }
Return Values
操作が成功した場合、 replace_one
メソッドはUpdateResult
タイプを返します。 UpdateResult
型には、操作を説明する次のプロパティが含まれています。
プロパティ | 説明 |
---|---|
| フィルターに一致するドキュメントの数 |
| 操作によって変更されたドキュメントの数 |
| アップサートされたドキュメントの |
replace_one()
に渡したクエリフィルターに一致するドキュメントが複数ある場合、メソッドは最初に一致したドキュメントを選択して置き換えます。 クエリフィルターに一致するドキュメントがない場合、置換操作では変更は行われません。
置き換えの例
次のドキュメントでは、会社の従業員について説明しています。
{ "_id": ObjectId('4501'), "name": "Matt DeGuy", "role": "Consultant", "team_members": [ "Jill Gillison", "Susan Lee" ] }
この例では、 replace_one()
メソッドを使用して、前のドキュメントを次のフィールドを持つドキュメントに置き換えます。
"Susan Lee"
のname
値"Lead Consultant"
のrole
値[ "Jill Gillison" ]
のteam_members
値
let replace_doc = doc! { "name": "Susan Lee", "role": "Lead Consultant", "team_members": vec! [ "Jill Gillison" ] }; let res = my_coll .replace_one(doc! { "name": "Matt DeGuy" }, replace_doc) .await?; println!( "Matched documents: {}\nModified documents: {}", res.matched_count, res.modified_count );
Matched documents: 1 Modified documents: 1
置換されたドキュメントには、置換ドキュメントの内容と不変の_id
フィールドが含まれます。
{ "_id": ObjectId('4501'), "name": "Susan Lee", "role": "Lead Consultant", "team_members": [ "Jill Gillison" ] }
更新および置換の動作を変更する
update_one()
メソッド、update_many
メソッド、 メソッドの動作を変更するには、replace_one()
UpdateOptions
構造体フィールドを設定するオプション メソッドを呼び出します。
注意
設定オプション
オプション ビルダのメソッドをアップデートまたは置換のメソッド呼び出しに直接連結することで、 UpdateOptions
フィールドを設定できます。 以前のバージョンのドライバーを使用している場合は、オプション ビルダー メソッドをbuilder()
メソッドに連結してUpdateOptions
インスタンスを構築する必要があります。 次に、オプション インスタンスをパラメーターとしてupdate_one()
、 update_many
、またはreplace_one()
に渡します。
次の表では、 UpdateOptions
で利用できるオプションについて説明しています。
オプション | 説明 |
---|---|
| The set of filters specifying the array elements to which the
update applies. Type: Vec<Document> |
| If true , allows the driver to perform a write that violates
document-level validation. To learn more about validation, see
the guide on Schema Validation.Type: bool Default: false |
| If true, the operation inserts a document if no documents match
the query filter. Type: bool |
| The collation to use when sorting results. To learn more about collations,
see the Collations guide. Type: Collation Default: None |
| The index to use for the operation. This option is available
only when connecting to MongoDB Server versions 4.2 and later. Type: Hint Default: None |
| The write concern for the operation. If you don't set this
option, the operation inherits the write concern set for
the collection. To learn more about write concerns, see
Write Concern in the
Server manual. Type: WriteConcern |
| A map of parameters and values. These parameters can be accessed
as variables in aggregation expressions. This option is available
only when connecting to MongoDB Server versions 5.0 and later. Type: Document |
| An arbitrary Bson value tied to the operation to trace
it through the database profiler, currentOp , and
logs. This option is available only when connecting to
MongoDB Server versions 4.4 and later.Type: Bson Default: None |
次のコードは、 upsert()
メソッドをupdate_one()
メソッドに連結してupsert
フィールドを設定する方法を示しています。
let res = my_coll .update_one(filter_doc, update_doc) .upsert(true) .await?;
詳細情報
このガイドの概念の詳細については、次のドキュメントを参照してください。
更新操作と置換操作の実行可能な例については、次の使用例を参照してください。
更新演算子の詳細については、サーバー マニュアルの「更新演算子 」を参照してください。
API ドキュメント
このガイドで言及されているメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。