Overview
このページでは、 MongoDB .NET/ C#ドライバーを使用して 1 つのMongoDBドキュメントのフィールドを更新する方法を学習できます。 このページでは、フィールドで実行するアップデート操作を指定する UpdateDefinition<TDocument> オブジェクトを作成する方法について説明します。 これらのオブジェクトを、Update One ページで説明されているアップデート メソッドに渡すことができます。
The .NET/C# Driver supports the field update operators described in the MongoDB Server manual. To specify an update operation, call the corresponding method from the Builders.Update property. The following sections describe these methods in more detail.
注意
メソッドのオーバーロード
このページのメソッドの多くには、複数のオーバーロードがあります。このガイドの例では、各メソッドの 1 つの定義のみを示します。利用可能なオーバーロードの詳細については、APIドキュメントを参照してください。
サンプル データ
このガイドの例では、 sample_restaurantsデータベースのrestaurantsコレクションを使用します。 このコレクションのドキュメントでは、次のRestaurant 、 Address 、 GradeEntryクラスをモデルとして使用します。
public class Restaurant { public ObjectId Id { get; set; } public string Name { get; set; } [] public string RestaurantId { get; set; } public string Cuisine { get; set; } public Address Address { get; set; } public string Borough { get; set; } public List<GradeEntry> Grades { get; set; } }
public class Address { public string Building { get; set; } [] public double[] Coordinates { get; set; } public string Street { get; set; } [] public string ZipCode { get; set; } }
public class GradeEntry { public DateTime Date { get; set; } public string Grade { get; set; } public float? Score { get; set; } }
注意
restaurantsコレクションのドキュメントは、スニペット ケースの命名規則を使用します。このガイドの例では、ConventionPack を使用してコレクション内のフィールドをパスカル ケースに逆シリアル化し、Restaurantクラスのプロパティにマップします。
カスタム直列化について詳しくは、「カスタム直列化」を参照してください。
このコレクションは、Atlas が提供するサンプル データセットから構成されています。 MongoDB クラスターを無料で作成して、このサンプル データをロードする方法については、クイック スタートを参照してください。
値の増加
フィールドの値を特定の量ずつ増加させるには、Builders.Update.Inc() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| インクリメントするフィールドを指定する式。 データ型: |
| フィールドを増加させる量。 データ型: |
次のコード例では、Inc() メソッドを使用して、一致するドキュメント内の Grades 配列の最初の GradeEntryオブジェクトで、Score の値を 2 ずつ増加させます。
var filter = Builders<Restaurant>.Filter.Eq("name", "Casa Bella"); var update = Builders<Restaurant>.Update .Inc(restaurant => restaurant.Grades[0].Score, 2); var result = _restaurantsCollection.UpdateOne(filter, update);
var filter = Builders<Restaurant>.Filter.Eq("name", "Casa Bella"); var update = Builders<Restaurant>.Update .Inc(restaurant => restaurant.Grades[0].Score, 2); var result = await _restaurantsCollection.UpdateOneAsync(filter, update);
値を乗算する
フィールドの値に特定の量を乗算するには、Builders.Update.Mul() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 更新するフィールドを指定する式。 データ型: |
| フィールドに乗じる量。 データ型: |
次のコード例では、Mul() メソッドを使用して、一致するドキュメント内の Grades 配列の最初の GradeEntryオブジェクトで、Score の値に 1.25 を乗算します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Casa Bella"); var update = Builders<Restaurant>.Update .Mul(restaurant => restaurant.Grades[0].Score, 1.25f); var result = _restaurantsCollection.UpdateOne(filter, update);
var filter = Builders<Restaurant>.Filter.Eq("name", "Casa Bella"); var update = Builders<Restaurant>.Update .Mul(restaurant => restaurant.Grades[0].Score, 1.25f); var result = await _restaurantsCollection.UpdateOneAsync(filter, update);
フィールド名の変更
フィールド の名前を変更するには、Builders.Update.Rename() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 名前を変更するフィールドを指定する式。 データ型: |
| フィールドの新しい名前。 データ型: |
次のコード例では、Rename() メソッドを使用して、一致するドキュメントの Addressフィールドの名前を location に変更します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Casa Bella"); var update = Builders<Restaurant>.Update .Rename(restaurant => restaurant.Address, "location"); var result = _restaurantsCollection.UpdateOne(filter, update);
var filter = Builders<Restaurant>.Filter.Eq("name", "Casa Bella"); var update = Builders<Restaurant>.Update .Rename(restaurant => restaurant.Address, "location"); var result = await _restaurantsCollection.UpdateOneAsync(filter, update);
注意
上記のコード例ではフィールド名 location が使用されています。これは、Restaurantクラスのプロパティ名ではなく、 MongoDB内のフィールド名の命名スキームと一致するためです。
値の設定
フィールドの値を特定の値に設定するには、Builders.Update.Set() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 更新するフィールドを指定する式。 データ型: |
| フィールドに設定する値。 データ型: |
次のコード例では、Set() メソッドを使用して、一致するドキュメントの recommendedフィールドの名前を true に変更します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Casa Bella"); var update = Builders<Restaurant>.Update .Set("recommended", true); var result = _restaurantsCollection.UpdateOne(filter, update);
var filter = Builders<Restaurant>.Filter.Eq("name", "Casa Bella"); var update = Builders<Restaurant>.Update .Set("recommended", true); var result = await _restaurantsCollection.UpdateOneAsync(filter, update);
注意
上記のコード例ではフィールド名 recommended が使用されています。これは、Restaurantクラスのプロパティ名ではなく、 MongoDB内のフィールド名の命名スキームと一致するためです。
比較による設定
フィールドの値を指定した値に更新するには、指定された値がフィールドの現在の値より大きい場合にのみ、 Builders.Update.Max()メソッドを呼び出します。このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 更新するフィールドを指定する式。 データ型: |
| フィールドに設定する値。 データ型: |
フィールドの値を指定した値に更新するには、指定された値がフィールドの現在の値より小さい場合にのみ、Builders.Update.Min() メソッドを呼び出します。このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 更新するフィールドを指定する式。 データ型: |
| フィールドに設定する値。 データ型: |
次のコード例では、Max() メソッドを使用して、最初の GradeEntryオブジェクトの Scoreフィールドを、20 と一致するドキュメント内の現在の値より大きい方に設定します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Casa Bella"); var update = Builders<Restaurant>.Update .Max(restaurant => restaurant.Grades[0].Score, 20); var result = _restaurantsCollection.UpdateOne(filter, update);
var filter = Builders<Restaurant>.Filter.Eq("name", "Casa Bella"); var update = Builders<Restaurant>.Update .Max(restaurant => restaurant.Grades[0].Score, 20); var result = await _restaurantsCollection.UpdateOneAsync(filter, update);
挿入時に設定
ドキュメントが 同じ操作でアップサートされた場合にのみフィールドの値を設定するには、Builders.Update.SetOnInsert() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 更新するフィールドを指定する式。 データ型: |
| フィールドに設定する値。 データ型: |
次のコード例では、SetOnInsert() メソッドを使用して、一致するドキュメントの recommendedフィールドを true に設定します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Patty's Pies"); var update = Builders<Restaurant>.Update .SetOnInsert("recommended", true); var result = _restaurantsCollection.UpdateOne( filter, update, new UpdateOptions { IsUpsert = true } );
var filter = Builders<Restaurant>.Filter.Eq("name", "Patty's Pies"); var update = Builders<Restaurant>.Update .SetOnInsert("recommended", true); var result = await _restaurantsCollection.UpdateOneAsync( filter, update, new UpdateOptions { IsUpsert = true } );
注意
上記のコード例ではフィールド名 recommended が使用されています。これは、Restaurantクラスのプロパティ名ではなく、 MongoDB内のフィールド名の命名スキームと一致するためです。
ドキュメントのアップサートの詳細については、 Update Oneガイドの 「構成オプション」 を参照してください。
現在の日付を設定
フィールドの値を現在の日付と時刻に設定するには、Builders.Update.CurrentDate() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 更新するフィールドを指定する式。 データ型: |
|
|
次のコード例では、CurrentDate() メソッドを使用して、最初の GradeEntryオブジェクトの Dateフィールドを、一致するドキュメント内の現在の日付に更新します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Casa Bella"); var update = Builders<Restaurant>.Update .CurrentDate(restaurant => restaurant.Grades[0].Date); var result = _restaurantsCollection.UpdateOne(filter, update);
var filter = Builders<Restaurant>.Filter.Eq("name", "Casa Bella"); var update = Builders<Restaurant>.Update .CurrentDate(restaurant => restaurant.Grades[0].Date); var result = await _restaurantsCollection.UpdateOneAsync(filter, update);
フィールドの設定解除
ドキュメントからフィールドを削除するには、Builders.Update.Unset() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 削除するフィールドを指定する式。 データ型: |
次のコード例では、Unset() メソッドを使用して、一致するドキュメントの Cuisineフィールドを削除します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Casa Bella"); var update = Builders<Restaurant>.Update .Unset(restaurant => restaurant.Cuisine); var result = _restaurantsCollection.UpdateOne(filter, update);
var filter = Builders<Restaurant>.Filter.Eq("name", "Casa Bella"); var update = Builders<Restaurant>.Update .Unset(restaurant => restaurant.Cuisine); var result = await _restaurantsCollection.UpdateOneAsync(filter, update);
API ドキュメント
このガイドで説明されているメソッドの詳細については、次のAPIドキュメントを参照してください。