Overview
このページでは、 MongoDB .NET/ C#ドライバーを使用して 1 つのMongoDBドキュメントのフィールドを更新する方法を学習できます。 このページでは、フィールドで実行するアップデート操作を指定する UpdateDefinition<TDocument> オブジェクトを作成する方法について説明します。 これらのオブジェクトを、 Update One ページで説明されているアップデート メソッドに渡すことができます。
.NET/ C#ドライバーは、 MongoDB Serverマニュアル に記載されているフィールド更新演算子をサポートしています。更新操作 を指定するには、Builders.Updateプロパティから対応するメソッドを呼び出します。 次のセクションでは、これらの方法について詳しく説明します。
注意
メソッドのオーバーロード
このページのメソッドの多くには、複数のオーバーロードがあります。このガイドの例では、各メソッドの 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クラスターを作成し、このサンプルデータをロードする方法については、 .NET/ C#ドライバーを使い始める を参照してください。
値の増加
フィールドの値を特定の量ずつ増加させるには、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ドキュメントを参照してください。