ドキュメントの変更
項目一覧
Overview
このガイドでは、MongoDB .NET/C# ドライバーを使用して、次の操作を実行して MongoDB コレクション内のドキュメントを変更する方法を学習できます。
.NET/C# ドライバーは、ドキュメントを変更するための次のメソッドを提供します。それぞれに非同期バージョンと同期バージョンがあります。
UpdateOneAsync()
orUpdateOne()
UpdateManyAsync()
orUpdateMany()
ReplaceOneAsync()
orReplaceOne()
Tip
インタラクティブ ラボ
このページには、 UpdateManyAsync()
メソッドを使用してデータを変更する方法を示す短いインタラクティブ ラボが含まれています。 MongoDB やコード エディターをインストールしなくても、ブラウザ ウィンドウでこのラボを直接完了できます。
ラボを開始するには、ページ上部の [ Open Interactive Tutorialボタンをクリックします。 ラボを全画面形式に展開するには、ラボ ペインの右上隅にある全画面ボタン( ⛶ )をクリックします。
サンプル データ
このガイドの例では、 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 クラスターを無料で作成して、このサンプル データをロードする方法については、クイック スタートを参照してください。
アップデート操作
MongoDB では、次の方法で更新操作を実行できます。
UpdateOne()
は、検索条件に一致する最初のドキュメントを更新します。UpdateMany()
は、検索条件に一致するすべてのドキュメントを更新します
必要なパラメーター
各更新方法には次のパラメーターが必要です。
アップデートするレコードを決定するクエリフィルタードキュメント 。 クエリフィルターの詳細については、 MongoDB サーバーのマニュアルを参照してください。
更新演算子(実行する更新の種類)と変更する必要があるフィールドと値を指定する更新ドキュメント。 更新演算子とその使用方法の完全なリストについては、「フィールド更新演算子 のマニュアル ページ」を参照してください。
.NET/C# ドライバーは、クエリフィルターとアップデート ドキュメントの両方の作成を簡素化するBuilders
クラスを提供します。 次のコード例では、 Builders
を使用して更新操作のパラメータとして使用する 2 つのドキュメントを作成します。
cuisine
フィールド値が「Pizza」であるレストランを検索するクエリフィルターこれらのレストランの
cuisine
フィールドの値を「Pasta and cake」に設定するアップデート ドキュメント
const string oldValue = "Pizza"; const string newValue = "Pasta and breadsticks"; // Creates a filter for all documents with a "cuisine" value of "Pizza" var filter = Builders<Restaurant>.Filter .Eq(restaurant => restaurant.Cuisine, oldValue); // Creates instructions to update the "cuisine" field of documents that // match the filter var update = Builders<Restaurant>.Update .Set(restaurant => restaurant.Cuisine, newValue); // Updates all documents that have a "cuisine" value of "Pizza" return _restaurantsCollection.UpdateMany(filter, update);
Tip
更新操作における集計パイプライン
MongoDB バージョン4.2以降を使用している場合は、更新操作で 集計ステージ のサブセットで構成された集計パイプラインを使用できます。 更新操作で使用される集計パイプラインで MongoDB がサポートする集計ステージの詳細については、 集計パイプラインを使用して更新を構築するに関するチュートリアル を参照してください。
1 つのドキュメントの更新
次のコードは、非同期UpdateOneAsync()
メソッドまたは同期UpdateOne()
メソッドを使用して 1 つのドキュメントを更新する方法を示しています。
var result = await _restaurantsCollection.UpdateOneAsync(filter, update);
var result = _restaurantsCollection.UpdateOne(filter, update);
多くのドキュメントの更新
次のコードは、非同期UpdateManyAsync()
メソッドまたは同期UpdateMany()
メソッドを使用して、一致したドキュメントをすべてアップデートする方法を示しています。
var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
var result = _restaurantsCollection.UpdateMany(filter, update);
Tip
これらのメソッドを使用する実行可能な例については、「追加情報 」を参照してください。
更新操作をカスタマイズする
どちらの方法でも、アップデート操作を構成するために使用できるオプションを表す追加のパラメータとしてUpdateOptions
オブジェクトを受け入れます。 UpdateOptions
プロパティを指定しない場合、ドライバーは更新操作をカスタマイズしません。
UpdateOptions
タイプでは、次のプロパティを持つオプションを構成できます。
プロパティ | 説明 |
---|---|
ArrayFilters | Specifies which array elements to modify for an update operation on an array field.
See the MongoDB server manual
for more information. |
BypassDocumentValidation | Specifies whether the update operation bypasses document validation. This lets you
update documents that don't meet the schema validation requirements, if any
exist. See the MongoDB server manual
for more information on schema validation. |
Collation | Specifies the kind of language collation to use when sorting
results. See the MongoDB server manual
for more information on collation. |
Comment | Gets or sets the user-provided comment for the operation.
See the MongoDB server manual
for more information. |
Hint | Gets or sets the index to use to scan for documents.
See the MongoDB server manual
for more information. |
IsUpsert | Specifies whether the update operation performs an upsert operation if no
documents match the query filter.
See the MongoDB server manual
for more information. |
Let | Gets or sets the let document.
See the MongoDB server manual
for more information. |
戻り値
UpdateOne()
メソッドとUpdateMany()
メソッドはそれぞれUpdateResult
オブジェクトを返します。 UpdateResult
型には次のプロパティが含まれています。
プロパティ | 説明 |
---|---|
IsAcknowledged | Indicates whether the update operation was acknowledged by MongoDB. |
IsModifiedCountAvailable | Indicates whether you can read the count of updated records on the
UpdateResult . |
MatchedCount | The number of documents that matched the query filter, regardless of
how many were updated. |
ModifiedCount | The number of documents updated by the update operation. If an updated
document is identical to the original, it won't be included in this count. |
UpsertedId | The ID of the document that was upserted in the database, if the driver
performed an upsert. |
例
次のコードでは、 UpdateMany()
メソッドを使用して、 borough
フィールドの値が「manhattan」であるすべてのドキュメントを検索し、これらのドキュメントのborough
値を「manhattan(north)」に更新します。 IsUpsert
オプションがtrue
に設定されているため、クエリフィルターが既存のドキュメントと一致しない場合、ドライバーは新しいドキュメントを挿入します。
var filter = Builders<Restaurant>.Filter .Eq(restaurant => restaurant.Borough, "Manhattan"); var update = Builders<Restaurant>.Update .Set(restaurant => restaurant.Borough, "Manhattan (north)"); UpdateOptions opts = new UpdateOptions() { Comment = new BsonString("Borough updated for C# Driver Fundamentals"), IsUpsert = true }; Console.WriteLine("Updating documents..."); var result = _restaurantsCollection.UpdateMany(filter, update, opts); Console.WriteLine($"Updated documents: {result.ModifiedCount}"); Console.WriteLine($"Result acknowledged? {result.IsAcknowledged}");
Updating documents... Updated documents: 10259 Result acknowledged? True
注意
上記の例ではUpdateMany()
ではなくUpdateOne()
メソッドが使用されていた場合、ドライバーは一致したドキュメントの最初の 個のドキュメントのみをアップデートします。
置換操作
MongoDB ではReplaceOne()
メソッドを使用して置換操作を実行できます。 このメソッドは、検索条件に一致する最初のドキュメントからすべてのフィールド( _id
フィールドを除く)を削除し、指定したフィールドと値をドキュメントに挿入します。
必要なパラメーター
ReplaceOne()
メソッドには次のパラメーターが必要です。
置き換えるレコードを決定する クエリフィルター ドキュメント 。
置換ドキュメントで、新しいドキュメントに挿入するフィールドと値を指定します。 コレクション内のドキュメントが C# クラスにマッピングされている場合、置換ドキュメントはこのクラスのインスタンスにすることができます。
アップデート操作と同様に、.NET/C# ドライバーのBuilders
クラスを使用してクエリフィルターを作成できます。 次のコード例では、 Builders
を使用して、 name
フィールド値が「Pizzaクライアント」のレストランを検索するクエリフィルターを作成します。 このコードでは、最初に一致したドキュメントを置き換える新しいRestaurant
オブジェクトも作成されます。
// 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() { Street = "Pizza St", ZipCode = "10003" }, Borough = "Manhattan", }; // Replaces the existing restaurant document with the new document return _restaurantsCollection.ReplaceOne(filter, newPizzaRestaurant);
重要
_id
フィールドの値は不変です。 置き換えドキュメントで_id
フィールドに値が指定される場合は、既存のドキュメントの_id
値と一致する必要があります。
次のコードは、非同期ReplaceOneAsync()
メソッドまたは同期ReplaceOne()
メソッドを使用して 1 つのドキュメントを置き換える方法を示しています。
var result = await _restaurantsCollection.ReplaceOneAsync(filter, newRestaurant);
var result = _restaurantsCollection.ReplaceOne(filter, newRestaurant);
Tip
これらのメソッドを使用する実行可能な例については、「追加情報 」を参照してください。
置換操作をカスタマイズする
ReplaceOne()
メソッドは、置換操作を構成するために使用できるオプションを表す追加のパラメータとしてReplaceOptions
オブジェクトをオプションで受け入れます。 ReplaceOptions
プロパティを指定しない場合、ドライバーは置換操作をカスタマイズしません。
ReplaceOptions
タイプでは、次のプロパティを持つオプションを構成できます。
プロパティ | 説明 |
---|---|
BypassDocumentValidation | Specifies whether the replace operation bypasses document validation. This lets you
replace documents that don't meet the schema validation requirements, if any
exist. See the MongoDB server manual
for more information on schema validation. |
Collation | Specifies the kind of language collation to use when sorting
results. See the MongoDB server manual
for more information on collation. |
Comment | Gets or sets the user-provided comment for the operation.
See the MongoDB server manual
for more information. |
Hint | Gets or sets the index to use to scan for documents.
See the MongoDB server manual
for more information. |
IsUpsert | Specifies whether the replace operation performs an upsert operation if no
documents match the query filter.
See the MongoDB server manual
for more information. |
Let | Gets or sets the let document.
See the MongoDB server manual
for more information. |
戻り値
ReplaceOne()
メソッドはReplaceOneResult
オブジェクトを返します。 ReplaceOneResult
型には次のプロパティが含まれています。
プロパティ | 説明 |
---|---|
IsAcknowledged | Indicates whether the replace operation was acknowledged by MongoDB. |
IsModifiedCountAvailable | Indicates whether you can read the count of replaced records on the
ReplaceOneResult . |
MatchedCount | The number of documents that matched the query filter, regardless of
whether one was replaced. |
ModifiedCount | The number of documents replaced by the replace operation. |
UpsertedId | The ID of the document that was upserted in the database, if the driver
performed an upsert. |
例
次のコードでは、 ReplaceOne()
メソッドを使用して、 name
フィールドの値が「Pizza Down」である最初のドキュメントを検索し、このドキュメントを「 Engine World 」という名前の新しいRestaurant
ドキュメントに置き換えます。 IsUpsert
オプションがtrue
に設定されているため、クエリフィルターが既存のドキュメントと一致しない場合、ドライバーは新しいドキュメントを挿入します。
var filter = Builders<Restaurant>.Filter.Eq(restaurant => restaurant.Name, "Pizza Town"); Restaurant newRestaurant = new() { Name = "Food World", Cuisine = "American", Address = new BsonDocument { {"street", "Food St"}, {"zipcode", "10003"}, }, Borough = "Manhattan", }; ReplaceOptions opts = new ReplaceOptions() { Comment = new BsonString("Restaurant replaced for .NET/C# Driver Fundamentals"), IsUpsert = true }; Console.WriteLine("Replacing document..."); var result = _restaurantsCollection.ReplaceOne(filter, newRestaurant, opts); Console.WriteLine($"Replaced documents: {result.ModifiedCount}"); Console.WriteLine($"Result acknowledged? {result.IsAcknowledged}");
Replacing document... Replaced documents: 1 Result acknowledged? True
詳細情報
更新操作と置換操作の実行可能な例については、次の使用例を参照してください。
クエリフィルターの作成の詳細については、「クエリの指定」ガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。