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

ドキュメントの変更

このガイドでは、アップデート操作と置換操作を使用して 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 が集計パイプラインでサポートする集計ステージの詳細については、集計パイプラインを使用して更新を実行するに関するチュートリアル を参照してください。

更新操作にはUpdateOptionsパラメータも必要です。 更新メソッドの動作の変更の詳細については、このガイドの「更新と置換の動作の変更 」セクションを参照してください。

操作が成功した場合、 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, None)
.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, None)
.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()メソッドはクエリフィルターと置換ドキュメントを受け取ります。このドキュメントには、既存のドキュメントを置き換えるフィールドと値が含まれます。 置換ドキュメントは以下の形式を使用します。

doc! { "<field>": <value>, "<field>": <value>, ... }

置き換え操作にはUpdateOptionsパラメーターも必要です。 replace_one()メソッドの動作の変更の詳細については、このガイドの「更新と置換の動作の変更 」セクションを参照してください。

操作が成功した場合、 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, None)
.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_manyreplace_one()UpdateOptionsメソッド、 メソッド、 メソッドの動作を変更するには、 構造体を作成してパラメーターとして渡します。

注意

インスタンス化オプション

Rust ドライバーは、 UpdateOptionsを含む多くのさまざまなタイプを作成するためのビルダ設計パターンを実装します。 各タイプのbuilder()メソッドを使用して、オプション ビルダー関数を 1 つずつ連鎖させてオプション インスタンスを構築できます。

次の表では、 UpdateOptionsで利用できるオプションについて説明しています。

オプション
説明

array_filters

更新を適用する配列要素を指定するフィルターのセット。

タイプ: Vec<Document>

bypass_document_validation

true の場合、ドライバーはドキュメント レベルの検証に違反する書き込み (write) を実行できます。検証の詳細については、「スキーマ検証」に関するガイドを参照してください。

タイプ: bool
デフォルト: false

upsert

true の場合、クエリフィルターに一致するドキュメントがない場合、操作によってドキュメントが挿入されます。

タイプ: bool

collation

結果をソートするときに使用する照合。照合について詳しくは、「照合」ガイドを参照してください。

タイプ: Collation
デフォルト: None

hint

操作に使用するインデックス。このオプションは、MongoDB Server バージョン 4.2 以降に接続する場合にのみ利用できます。

タイプ: Hint
デフォルト: 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

パラメーターと値のマップ。これらのパラメーターは、集計式の変数としてアクセスできます。このオプションは、MongoDB Server バージョン 5.0 以降に接続する場合にのみ利用できます。

タイプ: Document

comment

データベースプロファイラー、currentOp、およびログを介して操作をトレースするための任意の Bson 値。このオプションは、MongoDB Server バージョン 4.4 以降に接続した場合にのみ使用できます。

タイプ: Bson
デフォルト: None

次のコードは、 UpdateOptionsインスタンスを構築し、それをupdate_one()メソッドに渡す方法を示しています。

let opts: UpdateOptions = UpdateOptions::builder().upsert(true).build();
let res = my_coll.update_one(filter_doc, update_doc, opts).await?;

このガイドの概念の詳細については、次のドキュメントを参照してください。

更新操作と置換操作の実行可能な例については、次の使用例を参照してください。

更新演算子の詳細については、サーバー マニュアルの「更新演算子 」を参照してください。

このガイドで言及されているメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。