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

Update Documents

このガイドでは、 Rustドライバーを使用して update_one() メソッドと update_many() メソッドを使用してMongoDBコレクション内のドキュメントを更新する方法を学習できます。

更新操作では、指定したフィールドが変更されますが、他のフィールドと値は変更されません。

MongoDBでは、更新メソッドは同じパターンに従います。

changeX() メソッド署名

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

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

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

Tip

複合操作を使用すると、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 のマニュアルを参照してください。

注意

更新操作における集計パイプライン

集計パイプラインを使用して更新操作を実行できます。MongoDB がサポートする集計ステージの詳細については、 MongoDB Serverマニュアルの「 集計パイプラインによる更新 」チュートリアルを参照してください。

操作が成功した場合、 update_one()メソッドとupdate_many()メソッドはUpdateResultタイプを返します。 UpdateResult型には、操作を記述する次のプロパティが含まれています。

プロパティ
説明

matched_count

フィルターに一致するドキュメントの数

modified_count

操作によって変更されたドキュメントの数

upserted_id

アップサートされたドキュメントの_id 、または空のドキュメントがない場合は空

update_one()に渡すクエリフィルターに一致するドキュメントが複数ある場合、メソッドは最初に一致したドキュメントを選択してアップデートします。 クエリフィルターに一致するドキュメントがない場合、アップデート操作では変更は行われません。

このセクションでは、update_one() メソッドと update_many() メソッドのクイック参照と完全なファイルの例を示します。

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

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

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

{
"_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 フィールドセクションまたはMongoDB ServerマニュアルのObjectId()メソッドのドキュメントを参照してください。

この例では、 sample_restaurantsデータベースの restaurantsコレクション内のドキュメントを更新します。 update_one() メソッドは、nameフィールドの値が "Spice Market" である最初のドキュメントに priceフィールドを追加します。

restaurantsコレクション内のドキュメントには、Document 型またはカスタムデータ型のインスタンスとしてアクセスできます。 コレクションのデータを表すデータ型を指定するには、強調表示された行の <T> 型パラメータを次のいずれかの値に置き換えます。

  • <Document>:コレクションドキュメントはBSONドキュメントとしてアクセスします

  • <Restaurant>: コードの上部で定義された Restaurant 構造体のインスタンスとしてコレクションドキュメントにアクセスします

各実行時に対応するコードを表示するには、 AsynchronousタブまたはSynchronousタブを選択します。

use std::env;
use mongodb::{
bson::{ Document, doc },
Client,
Collection
};
use serde::{ Deserialize, Serialize };
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
name: String,
price: String,
}
#[tokio::main]
async fn main() -> mongodb::error::Result<()> {
let uri = "<connection string>";
let client = Client::with_uri_str(uri).await?;
// Replace <T> with the <Document> or <Restaurant> type parameter
let my_coll: Collection<T> = client
.database("sample_restaurants")
.collection("restaurants");
let filter = doc! { "name": "Spice Market" };
let update = doc! { "$set": doc! {"price": "$$$"} };
let res = my_coll.update_one(filter, update).await?;
println!("Updated documents: {}", res.modified_count);
Ok(())
}
Updated documents: 1
use std::env;
use mongodb::{
bson::{ Document, doc },
sync::{ Client, Collection }
};
use serde::{ Deserialize, Serialize };
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
name: String,
price: String,
}
fn main() -> mongodb::error::Result<()> {
let uri = "<connection string>";
let client = Client::with_uri_str(uri)?;
// Replace <T> with the <Document> or <Restaurant> type parameter
let my_coll: Collection<T> = client
.database("sample_restaurants")
.collection("restaurants");
let filter = doc! { "name": "Spice Market" };
let update = doc! { "$set": doc! {"price": "$$$"} };
let res = my_coll.update_one(filter, update).run()?;
println!("Updated documents: {}", res.modified_count);
Ok(())
}
Updated documents: 1

この例では、 sample_restaurantsデータベースの restaurantsコレクション内のドキュメントを更新します。 update_many() メソッドは、address.streetフィールドの値が "Sullivan Street" であり、boroughフィールドの値が "Manhattan" であるドキュメントに near_meフィールドを追加します。

restaurantsコレクション内のドキュメントには、Document 型またはカスタムデータ型のインスタンスとしてアクセスできます。 コレクションのデータを表すデータ型を指定するには、強調表示された行の <T> 型パラメータを次のいずれかの値に置き換えます。

  • <Document>:コレクションドキュメントをBSONドキュメントとしてアクセスします。

  • <Restaurant>: コードの上部で定義された Restaurant 構造体のインスタンスとしてコレクションドキュメントにアクセスします

各実行時に対応するコードを表示するには、 AsynchronousタブまたはSynchronousタブを選択します。

use std::env;
use mongodb::{ bson::doc, Client, Collection };
use bson::Document;
use serde::{ Deserialize, Serialize };
#[derive(Debug, Serialize, Deserialize)]
struct Address {
street: String,
city: String,
}
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
name: String,
borough: String,
address: Address,
}
#[tokio::main]
async fn main() -> mongodb::error::Result<()> {
let uri = "<connection string>";
let client = Client::with_uri_str(uri).await?;
// Replace <T> with the <Document> or <Restaurant> type parameter
let my_coll: Collection<T> = client
.database("sample_restaurants")
.collection("restaurants");
let filter =
doc! {
"address.street": "Sullivan Street",
"borough": "Manhattan"
};
let update = doc! { "$set": doc! { "near_me": true } };
let res = my_coll.update_many(filter, update).await?;
println!("Updated documents: {}", res.modified_count);
Ok(())
}
// Your values might differ
Updated documents: 22
use std::env;
use mongodb::{
bson::{ Document, doc },
sync::{ Client, Collection }
};
use serde::{ Deserialize, Serialize };
#[derive(Debug, Serialize, Deserialize)]
struct Address {
street: String,
city: String,
}
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
name: String,
borough: String,
address: Address,
}
fn main() -> mongodb::error::Result<()> {
let uri = "<connection string>";
let client = Client::with_uri_str(uri)?;
// Replace <T> with the <Document> or <Restaurant> type parameter
let my_coll: Collection<T> = client
.database("sample_restaurants")
.collection("restaurants");
let filter =
doc! {
"address.street": "Sullivan Street",
"borough": "Manhattan"
};
let update = doc! { "$set": doc! { "near_me": true } };
let res = my_coll.update_many(filter, update).run()?;
println!("Updated documents: {}", res.modified_count);
Ok(())
}
// Your values might differ
Updated documents: 22

UpdateOptions 構造体フィールドを設定するオプション メソッドを呼び出すことで、update_one() メソッドと update_many() メソッドの動作を変更できます。

注意

設定オプション

オプション ビルダのメソッドを更新 メソッドの呼び出しに直接連結することで、UpdateOptions フィールドを設定できます。以前のバージョンのドライバーを使用している場合は、オプション ビルダー メソッドを builder() メソッドに連結して UpdateOptionsインスタンスを構築する必要があります。次に、オプションインスタンスをパラメーターとして update_one() または update_many() に渡します。

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

オプション
説明

array_filters

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

タイプ: Vec<Document>

bypass_document_validation

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

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

upsert

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

型: bool

collation

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

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

hint

操作に使用するインデックス。

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

write_concern

操作の書込み保証 (write concern)。このオプションを設定しない場合、操作はコレクションに設定された書込み保証 (write concern)を継承します。書込み保証 (write concern)の詳細については、 MongoDB Serverマニュアルの「書込み保証 (write concern)」を参照してください。

タイプ: WriteConcern

let_vars

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

タイプ: Document

comment

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

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

次のコードは、 upsert()メソッドをupdate_one()メソッドに連結してupsertフィールドを設定する方法を示しています。

let res = my_coll
.update_one(filter_doc, update_doc)
.upsert(true)
.await?;

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

更新演算子の詳細については、 MongoDB Serverマニュアルの更新演算子を参照してください。

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