Docs Menu
Docs Home
/ / /
C#/.NET ドライバー
/ /

1 つのドキュメントのフィールドの更新

このページでは、 MongoDB .NET/ C#ドライバーを使用して 1 つのMongoDBドキュメントのフィールドを更新する方法を学習できます。 このページでは、フィールドで実行するアップデート操作を指定する UpdateDefinition<TDocument> オブジェクトを作成する方法について説明します。 これらのオブジェクトを、 Update One ページで説明されているアップデート メソッドに渡すことができます。

.NET/ C#ドライバーは、 MongoDB Serverマニュアル に記載されているフィールド更新演算子をサポートしています。更新操作 を指定するには、Builders.Updateプロパティから対応するメソッドを呼び出します。 次のセクションでは、これらの方法について詳しく説明します。

注意

メソッドのオーバーロード

このページのメソッドの多くには、複数のオーバーロードがあります。 このガイドの例では、各メソッドの 1 つの定義のみを示します。 利用可能なオーバーロードの詳細については、 APIドキュメント を参照してください。

このガイドの例では、 sample_restaurantsデータベースのrestaurantsコレクションを使用します。 このコレクションのドキュメントでは、次のRestaurantAddressGradeEntryクラスをモデルとして使用します。

public class Restaurant
{
public ObjectId Id { get; set; }
public string Name { get; set; }
[BsonElement("restaurant_id")]
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; }
[BsonElement("coord")]
public double[] Coordinates { get; set; }
public string Street { get; set; }
[BsonElement("zipcode")]
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
説明

field

インクリメントするフィールドを指定する式。

データ型: Expression<Func<TDocument, TField>>

value

フィールドを増加させる量。

データ型: TField

次のコード例では、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
説明

field

更新するフィールドを指定する式。

データ型: Expression<Func<TDocument, TField>>

value

フィールドに乗じる量。

データ型: TField

次のコード例では、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
説明

field

名前を変更するフィールドを指定する式。

データ型: Expression<Func<TDocument, TField>>

newName

フィールドの新しい名前。

データ型: string

次のコード例では、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
説明

field

更新するフィールドを指定する式。

データ型: Expression<Func<TDocument, TField>>

value

フィールドに設定する値。

データ型: TField

次のコード例では、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
説明

field

更新するフィールドを指定する式。

データ型: Expression<Func<TDocument, TField>>

value

フィールドに設定する値。

データ型: TField

フィールドの値を指定した値に更新するには、指定された値がフィールドの現在の値より小さい場合にのみ、Builders.Update.Min() メソッドを呼び出します。このメソッドは次のパラメーターを受け入れます:

Parameter
説明

field

更新するフィールドを指定する式。

データ型: Expression<Func<TDocument, TField>>

value

フィールドに設定する値。

データ型: TField

次のコード例では、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
説明

field

更新するフィールドを指定する式。

データ型: Expression<Func<TDocument, TField>>

value

フィールドに設定する値。

データ型: TField

次のコード例では、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
説明

field

更新するフィールドを指定する式。

データ型: Expression<Func<TDocument, TField>>

type

UpdateDefinitionCurrentDateType列挙で定義される日付と時刻の形式。 デフォルト値は null です。

データ型: UpdateDefinitionCurrentDateType?

次のコード例では、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
説明

field

削除するフィールドを指定する式。

データ型: Expression<Func<TDocument, TField>>

次のコード例では、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ドキュメントを参照してください。

戻る

1 つのドキュメントの更新

項目一覧