ドキュメントの置換
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 クラスターを無料で作成して、このサンプル データをロードする方法については、クイック スタートを参照してください。
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マニュアルを参照してください。 データ型: 照合 |
| 操作のユーザー指定のコメントを取得または設定します。 詳細については、 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);
戻り値
ReplaceOne()
メソッドは ReplaceOneResult
オブジェクトを返し、ReplaceOneAsync()
メソッドは Task<ReplaceOneResult>
オブジェクトを返します。 ReplaceOneResult
クラスには次のプロパティが含まれています。
プロパティ | 説明 |
---|---|
| 置き換え操作が MongoDB によって確認されたかどうかを示します。 データ型: |
|
データ型: |
| 置き換えられたかどうかにかかわらず、クエリフィルターに一致したドキュメントの数。 データ型: |
| 置換操作によって置き換えられたドキュメントの数。 データ型: |
| ドライバーがアップサートを実行した場合、データベースでアップサートされたドキュメントのID。 データ型: BsonValue |
API ドキュメント
このページで使用されているメソッドとクラスの詳細については、次のAPIドキュメントを参照してください。