Docs Menu
Docs Home
/ / /
Rust ドライバー
/ / /

ドキュメントの変更

項目一覧

  • Overview
  • ドキュメントパターンの更新
  • _id フィールド
  • Update Documents
  • パラメーター
  • 戻り値
  • 更新例
  • ObjectId による更新の例
  • ドキュメントの置き換え
  • パラメーター
  • Return Values
  • 置き換えの例
  • 更新および置換の動作を変更する
  • 詳細情報
  • API ドキュメント

このガイドでは、アップデート操作と置換操作を使用して MongoDB 内のドキュメントを変更する方法を学習できます。

更新操作では、指定したフィールドが変更されますが、他のフィールドと値は変更されません。 置き換え操作により、 _idフィールドを除くドキュメントのすべての既存のフィールドが削除され、削除されたフィールドは新しいフィールドと値に置き換えられます。

このガイドには、次のセクションが含まれています。

  • 「ドキュメントの更新」では、ドライバーを使用して更新操作を実行する方法について説明します

  • 「ドキュメントの置き換え」では、ドライバーを使用して置換操作を実行する方法について説明します。

  • 更新と置換の動作を変更する 」では、このガイドで説明されているメソッドのデフォルトの動作を変更する方法について説明します。

  • 追加情報では、このガイドで言及されている型とメソッドのリソースとAPIドキュメントへのリンクを提供します

MongoDB では、ドキュメントを変更するためのすべての方法は同じパターンに従います。

changeX() メソッド署名

注意

changeX() はプレースホルダーであり、実際のメソッドではありません。

これらのメソッドは、次のパラメーターを取ります。

  • 変更する 1 つ以上のドキュメントに一致するクエリフィルター

  • フィールドと値の変更を指定する 更新ドキュメント

Rust ドライバーは、ドキュメントを変更するための次のメソッドを提供します。

  • update_one()

  • update_many()

  • replace_one()

複合操作を使用すると、1 回のアクションでデータを検索して変更できます。 詳しくは、 複合演算子 に関するガイドをご覧ください。

MongoDB コレクション内の各ドキュメントには、一意かつ不変の_idフィールドがあります。 更新操作または置換操作を通じて_idフィールドを変更しようとすると、ドライバーはWriteErrorを発生させ、更新を実行しません。

次の方法で更新操作を実行できます。

  • 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型には、操作を記述する次のプロパティが含まれています。

プロパティ
説明
matched_count
フィルターに一致するドキュメントの数
modified_count
操作によって変更されたドキュメントの数
upserted_id
アップサートされたドキュメントの_id 、または空のドキュメントがない場合は空

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);

次のドキュメントは、前回の更新操作によって発生した変更を反映しています。

{
"_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
}

次のドキュメントでは、会社の従業員について説明しています。

{
"_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);

次のドキュメントには、前述の更新操作によって発生した変更が反映されています。

{
"_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>, ... }

操作が成功した場合、 replace_oneメソッドはUpdateResultタイプを返します。 UpdateResult型には、操作を説明する次のプロパティが含まれています。

プロパティ
説明
matched_count
フィルターに一致するドキュメントの数
modified_count
操作によって変更されたドキュメントの数
upserted_id
アップサートされたドキュメントの_id 、または空のドキュメントがない場合は空

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
);

置換されたドキュメントには、置換ドキュメントの内容と不変の_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で利用できるオプションについて説明しています。

オプション
説明
array_filters
The set of filters specifying the array elements to which the update applies.

Type: Vec<Document>
bypass_document_validation
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
upsert
If true, the operation inserts a document if no documents match the query filter.

Type: bool
collation
The collation to use when sorting results. To learn more about collations, see the Collations guide.

Type: Collation
Default: None
hint
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
write_concern
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
let_vars
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
comment
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ドキュメントを参照してください。

戻る

ドキュメントの挿入