Overview
このガイドでは、 .NET/ C#ドライバーを使用してMongoDBコレクション内のドキュメントを置き換える方法を学習できます。
.NET/ C#ドライバーは ReplaceOne() メソッドと ReplaceOneAsync() メソッドを提供します。 これらのメソッドは、検索条件に一致する最初のドキュメントからすべてのフィールド( _idフィールドを除く)を削除し、指定したフィールドと値をドキュメントに挿入します。
注意
メソッドのオーバーロード
このページのメソッドの多くには、複数のオーバーロードがあります。このガイドの例では、各メソッドの 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#ドライバーを使い始める を参照してください。
1 つのドキュメントの置換
コレクション内のドキュメントを置き換えるには、ReplaceOne() メソッドまたは ReplaceOneAsync() メソッドを呼び出します。 これらのメソッドは次のパラメーターを受け入れます。
Parameter | 説明 |
|---|---|
| 置き換えドキュメントを指定するクエリフィルター。 |
| 置換ドキュメント。新しいドキュメントに挿入するフィールドと値を指定します。コレクション内のドキュメントがC#クラスにマップされている場合、置換ドキュメントはこのクラスのインスタンスになることができます。 データ型: |
| 任意。置換操作の構成を指定する データ型: ReplaceOptions |
| 任意。操作 をキャンセルするために使用できるトークン。 データ型 : CancelToken |
次のコード例は、置換操作 を実行する方法を示しています。 このコードでは、次の手順が実行されます。
Buildersクラス を使用してクエリフィルターを作成します。 フィルターは、cuisineフィールドの値が"Pizza"であるすべてのドキュメントと一致します。新しい
Restaurantオブジェクトを作成します。restaurantsコレクションでReplaceOne()メソッドを呼び出します。 この操作は、 コレクション内で最初に一致するドキュメントを検索し、それを新しく作成されたドキュメントに置き換えます。
SynchronousAsynchronous対応するコードを表示するには、 タブまたは タブを選択します。
// Creates a filter for all restaurant documents that have a "cuisine" value of "Pizza" var filter = Builders<Restaurant>.Filter .Eq(r => r.Cuisine, "Pizza"); // Finds the ID of the first restaurant document that matches the filter var oldPizzaRestaurant = _restaurantsCollection.Find(filter).First(); var oldId = oldPizzaRestaurant.Id; // Generates a new restaurant document Restaurant newPizzaRestaurant = new() { Id = oldId, Name = "Mongo's Pizza", Cuisine = "Pizza", Address = new Address() { Street = "Pizza St", ZipCode = "10003" }, Borough = "Manhattan", }; // Replaces the existing restaurant document with the new document return _restaurantsCollection.ReplaceOne(filter, newPizzaRestaurant);
// Creates a filter for all restaurant documents that have a "cuisine" value of "Pizza" var filter = Builders<Restaurant>.Filter .Eq(r => r.Cuisine, "Pizza"); // Finds the ID of the first restaurant document that matches the filter var oldPizzaRestaurant = _restaurantsCollection.Find(filter).First(); var oldId = oldPizzaRestaurant.Id; // Generates a new restaurant document Restaurant newPizzaRestaurant = new() { Id = oldId, Name = "Mongo's Pizza", Cuisine = "Pizza", Address = new Address() { Street = "Pizza St", ZipCode = "10003" }, Borough = "Manhattan", }; // Asynchronously replaces the existing restaurant document with the new document return await _restaurantsCollection.ReplaceOneAsync(filter, newPizzaRestaurant);
重要
_idフィールドの値は不変です。 置き換えドキュメントで_idフィールドに値が指定される場合は、既存のドキュメントの_id値と一致する必要があります。
置き換えドキュメントで_idフィールドの値が指定されていない場合は、Plain Old CLR/Class Object(POCO)の _idフィールドに [BsonIgnoreIfDefault] 属性を追加できます。 POCO の _idフィールドが ObjectId タイプである場合は、[BsonIgnoreIfDefault] を使用します。
次の例は、この属性を追加する方法を示しています。
public class Restaurant { [] public ObjectId Id { get; set; } // Other properties }
置換操作をカスタマイズする
ReplaceOne() メソッドと ReplaceOneAsync() メソッドはオプションで、置換操作 を構成するために使用できるオプションを表す ReplaceOptionsオブジェクトをパラメーターとして受け入れます。
ReplaceOptionsクラスには、次のプロパティが含まれています。
プロパティ | 説明 | ||||
|---|---|---|---|---|---|
| 置換操作がドキュメントの検証をバイパスするかどうかを指定します。 これにより、スキーマ検証要件を満たさないドキュメントを存在する場合に置き換えることができます。 スキーマ検証の詳細については、 MongoDB Serverマニュアルを参照してください。 データ型: | ||||
| |||||
| 操作のユーザー指定のコメントを取得または設定します。 詳細については、 MongoDB Server のマニュアルを参照してください。 データ型: BsonValue | ||||
| ドキュメントをスキャンするために使用するインデックスを取得または設定します。 詳細については、 MongoDB Server のマニュアルを参照してください。 データ型: BsonValue | ||||
| クエリフィルターに一致するドキュメントがない場合に、置換操作でアップサート操作を実行するかどうかを指定します。 詳細については、 MongoDB Server のマニュアルを参照してください。 データ型: | ||||
| クエリで複数のドキュメントが選択された場合に、その操作で置き換えるドキュメントを決定します。これは、置き換え操作が指定されたソート順の最初のドキュメントを置き換えるためです。このオプションを設定するには、次のコードに示すように、データをモデル化するジェネリック型を使用する データ型: | ||||
| letドキュメント を取得または設定します。 詳細については、 MongoDB Server のマニュアルを参照してください。 データ型: BsonDocument |
次の例では、前の例と同じ手順を実行しますが、スキーマ検証要件をバイパスするために BypassDocumentValidation オプションも使用されています。 対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
// Creates a filter for all restaurant documents that have a "cuisine" value of "Pizza" var filter = Builders<Restaurant>.Filter .Eq(r => r.Cuisine, "Pizza"); // Finds the ID of the first restaurant document that matches the filter var oldPizzaRestaurant = _restaurantsCollection.Find(filter).First(); var oldId = oldPizzaRestaurant.Id; // Generates a new restaurant document Restaurant newPizzaRestaurant = new() { Id = oldId, Name = "Mongo's Pizza", Cuisine = "Pizza", Address = new Address() { Street = "Pizza St", ZipCode = "10003" }, Borough = "Manhattan", }; var options = new ReplaceOptions { BypassDocumentValidation = true }; // Replaces the existing restaurant document with the new document return _restaurantsCollection.ReplaceOne(filter, newPizzaRestaurant, options);
// Creates a filter for all restaurant documents that have a "cuisine" value of "Pizza" var filter = Builders<Restaurant>.Filter .Eq(r => r.Cuisine, "Pizza"); // Finds the ID of the first restaurant document that matches the filter var oldPizzaRestaurant = _restaurantsCollection.Find(filter).First(); var oldId = oldPizzaRestaurant.Id; // Generates a new restaurant document Restaurant newPizzaRestaurant = new() { Id = oldId, Name = "Mongo's Pizza", Cuisine = "Pizza", Address = new Address() { Street = "Pizza St", ZipCode = "10003" }, Borough = "Manhattan", }; var options = new ReplaceOptions { BypassDocumentValidation = true }; // Asynchronously replaces the existing restaurant document with the new document return await _restaurantsCollection.ReplaceOneAsync(filter, newPizzaRestaurant, options);
照合
操作の照合を構成するには、照合クラスのインスタンスを作成します。
次の表では、Collation コンストラクターが受け入れるパラメーターを説明しています。また、各設定の値を読み取るために使用できる対応するクラスプロパティも一覧表示されます。
Parameter | 説明 | クラスプロパティ |
|---|---|---|
| 国際化コンポーネント for Unicode (ICU) ロケールを指定します。サポートされているロケールの一覧については、MongoDB Server マニュアルの「照合ロケールとデフォルトパラメータ」を参照してください。 |
|
| (任意) 大文字と小文字の比較を含めるかどうかを指定します。 |
|
| (任意) 三次レベルの比較中の大文字と小文字の相違のソート順序を指定します。 |
|
| (任意) ICU ドキュメントで定義されている、実行する比較のレベルを指定します。 |
|
| (任意) ドライバーが数字の文字列を数値として比較するかどうかを指定します。 |
|
| (任意) ドライバーが比較の基準文字として空白と句読点を考慮するかどうかを指定します。 |
|
| (任意) |
|
|
|
|
| (任意) 発音区別符号を含む string を、string の後ろから前にソートするかどうかを指定します。 |
|
照合の詳細については、 MongoDB Serverマニュアルの 照合 ページを参照してください。
戻り値
ReplaceOne() メソッドは ReplaceOneResultオブジェクトを返し、ReplaceOneAsync() メソッドは Task<ReplaceOneResult>オブジェクトを返します。 ReplaceOneResultクラスには次のプロパティが含まれています。
プロパティ | 説明 |
|---|---|
| 置き換え操作が MongoDB によって確認されたかどうかを示します。 データ型: |
|
データ型: |
| 置き換えられたかどうかにかかわらず、クエリフィルターに一致したドキュメントの数。 データ型: |
| 置換操作によって置き換えられたドキュメントの数。 データ型: |
| ドライバーがアップサートを実行した場合、データベースでアップサートされたドキュメントのID。 データ型: BsonValue |
詳細情報
置換操作の実行可能な例については、次の使用例を参照してください。
API ドキュメント
このページで使用されているメソッドとクラスの詳細については、次のAPIドキュメントを参照してください。