Overview
このページでは、配列フィールド用の UpdateDefinition オブジェクトを作成する方法を学びます。 UpdateDefinitionオブジェクトは、実行する更新操作の種類、更新するフィールド、および各フィールドの新しい値を指定します(該当する場合)。
The .NET/C# Driver supports the array update operators and modifiers described in the MongoDB Server manual. To create an UpdateDefinition object for one of these operators, call the corresponding method from the Builders.Update property. The following sections describe these methods in more detail.
UpdateDefinitionオブジェクトを作成したら、それを UpdateMany() メソッドまたは UpdateManyAsync() メソッドに渡します。 これらのメソッドの詳細については、「 多数更新 」ページを参照してください。
注意
メソッドのオーバーロード
このページのメソッドの多くには、複数のオーバーロードがあります。このガイドの例では、各メソッドの 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 つの値を追加
配列の末尾に 1 つの値を追加するには、Builders.Update.Push() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 値を追加する配列フィールドを指定する式。 データ型: |
| 配列フィールドの末尾に追加する値。 データ型: |
次のコード例では、 Push() メソッドを使用して、一致するすべてのドキュメントの Grades 配列に新しい GradeEntryオブジェクトを追加します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var update = Builders<Restaurant>.Update .Push(restaurant => restaurant.Grades, new GradeEntry() { Date = DateTime.Now, Grade = "A", Score = 96 }); var result = _restaurantsCollection.UpdateMany(filter, update); return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var update = Builders<Restaurant>.Update .Push(restaurant => restaurant.Grades, new GradeEntry() { Date = DateTime.Now, Grade = "A", Score = 96 }); var result = await _restaurantsCollection.UpdateManyAsync(filter, update); return result;
Tip
プッシュ操作の構成
配列内の特定の位置に値を追加したり、配列を更新した後に配列をソートしたりスライスしたりするには、代わりに RustEach() メソッドを呼び出します。
配列の末尾に 1 つの値を追加するには、配列内にまだ存在しない場合のみ、 Builders.Update.AddToSet()メソッドを呼び出します。MongoDB Server は、値のBSON表現を配列内の各要素のBSON表現と比較して、値が配列に既に存在するかどうかを判断します。
AddToSet() メソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 値を追加する配列フィールドを指定する式。 データ型: |
| 配列フィールドの末尾に追加する値。 データ型: |
次のコード例では、 AddToSet() メソッドを呼び出して、一致するすべてのドキュメントの Grades 配列に最初の GradeEntryオブジェクトを再度追加します。 値はすでに配列に存在するため、アップデート操作は何も実行されません。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var firstGradeEntry = _restaurantsCollection.Find(filter).FirstOrDefault().Grades[0]; var update = Builders<Restaurant>.Update .AddToSet(restaurant => restaurant.Grades, firstGradeEntry); var result = _restaurantsCollection.UpdateMany(filter, update); return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var firstGradeEntry = _restaurantsCollection.Find(filter).FirstOrDefault().Grades[0]; var update = Builders<Restaurant>.Update .AddToSet(restaurant => restaurant.Grades, firstGradeEntry); var result = await _restaurantsCollection.UpdateManyAsync(filter, update); return result;
複数の値の追加
配列に複数の値を追加するには、Builders.Update.PushEach() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 1 つ以上の値を追加する配列フィールドを指定する式。 データ型: |
| 配列フィールドに追加する値。 データ型: |
| 更新後に配列の先頭からカウントする、配列に保持する要素の数。 値が負の場合、メソッドは配列の末尾から指定された数の要素を保持します。 データ型: |
| 配列内で値を追加する位置。 デフォルトでは 、 メソッドは配列の末尾に値を追加します。 データ型: |
| 新しい値を追加した後にドライバーが配列要素をソートする方法を指定する データ型: SortDefinition<TItem> |
次のコード例では、 PushEach() メソッドを使用して、2 つの新しい GradeEntry オブジェクトを一致するすべてのドキュメントの Grades 配列の先頭に追加します。 次に、配列要素を Score フィールドの値で降順にソートします。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var newGrades = new List<GradeEntry> { new GradeEntry { Date = DateTime.Now, Grade = "A", Score = 95 }, new GradeEntry { Date = DateTime.Now, Grade = "B+", Score = 89,} }; var scoreSort = Builders<GradeEntry>.Sort.Descending(g => g.Score); var update = Builders<Restaurant>.Update.PushEach( "Grades", newGrades, position: 0, sort: scoreSort); var result = _restaurantsCollection.UpdateMany(filter, update); return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var newGrades = new List<GradeEntry> { new GradeEntry { Date = DateTime.Now, Grade = "A", Score = 95 }, new GradeEntry { Date = DateTime.Now, Grade = "B+", Score = 89,} }; var scoreSort = Builders<GradeEntry>.Sort.Descending(g => g.Score); var update = Builders<Restaurant>.Update.PushEach( "Grades", newGrades, position: 0, sort: scoreSort); var result = await _restaurantsCollection.UpdateManyAsync(filter, update); return result;
配列に複数の値を追加するには、それらが配列にまだ存在しない場合にのみ、 Builders.Update.AddToSetEach()メソッドを呼び出します。このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 1 つ以上の値を追加する配列フィールドを指定する式。 データ型: |
| 配列フィールドに追加する値。 データ型: |
次のコード例では、 AddToSetEach() メソッドを呼び出して、最初と 2 番目の GradeEntry オブジェクトを一致するすべてのドキュメントの Grades 配列に再度追加します。 これらの値はすでに配列に存在するため、アップデート操作は何も実行されません。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var doc = _restaurantsCollection.Find(filter).FirstOrDefault(); var firstGradeEntries = new List<GradeEntry> { doc.Grades[0], doc.Grades[1] }; var update = Builders<Restaurant>.Update .AddToSetEach(restaurant => restaurant.Grades, firstGradeEntries); var result = _restaurantsCollection.UpdateMany(filter, update); return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var doc = _restaurantsCollection.Find(filter).FirstOrDefault(); var firstGradeEntries = new List<GradeEntry> { doc.Grades[0], doc.Grades[1] }; var update = Builders<Restaurant>.Update .AddToSetEach(restaurant => restaurant.Grades, firstGradeEntries); var result = await _restaurantsCollection.UpdateManyAsync(filter, update); return result;
Remove Values
次のセクションでは、配列フィールドから値を削除する方法について説明します。
最初の値
配列から最初の値を削除するには、Builders.Update.PopFirst() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 最初の値を削除する配列フィールドを指定する式。 データ型: |
次のコード例では、 PopFirst() メソッドを使用して、一致するすべてのドキュメントの Grades 配列から最初の GradeEntryオブジェクトを削除します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var update = Builders<Restaurant>.Update .PopFirst(restaurant => restaurant.Grades); var result = _restaurantsCollection.UpdateMany(filter, update); return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var update = Builders<Restaurant>.Update .PopFirst(restaurant => restaurant.Grades); var result = await _restaurantsCollection.UpdateManyAsync(filter, update); return result;
最後の値
配列から最後の値を削除するには、Builders.Update.PopLast() メソッドを呼び出します。このメソッドは次のパラメータを受け入れます。
Parameter | 説明 |
|---|---|
| 最後の値を削除する配列フィールドを指定する式。 データ型: |
次のコード例では、 PopLast() メソッドを使用して、一致するすべてのドキュメント内の Grades 配列から最後の GradeEntryオブジェクトを削除します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var update = Builders<Restaurant>.Update .PopLast(restaurant => restaurant.Grades); var result = _restaurantsCollection.UpdateMany(filter, update); return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var update = Builders<Restaurant>.Update .PopLast(restaurant => restaurant.Grades); var result = await _restaurantsCollection.UpdateManyAsync(filter, update); return result;
値のすべてのインスタンス
配列から特定の値のすべてのインスタンスを削除するには、Builders.Update.Pull() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 値を削除する配列フィールドを指定する式。 データ型: |
| 配列フィールドから削除する値。 データ型: |
次のコード例では、 Pull() メソッドを使用して、一致するすべてのドキュメント内の Grades 配列から特定の GradeEntryオブジェクトのすべてのインスタンスを削除します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); // Add duplicate values to Grades array var newGrades = new List<GradeEntry> { new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95 }, new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95,} }; var addUpdate = Builders<Restaurant>.Update .PushEach("Grades", newGrades); _restaurantsCollection.UpdateMany(filter, addUpdate); // Remove duplicates from Grades array var pullUpdate = Builders<Restaurant>.Update .Pull(restaurant => restaurant.Grades, newGrades[0]); var result = _restaurantsCollection.UpdateMany(filter, pullUpdate); return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); // Add duplicate values to Grades array var newGrades = new List<GradeEntry> { new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95 }, new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95,} }; var addUpdate = Builders<Restaurant>.Update .PushEach("Grades", newGrades); await _restaurantsCollection.UpdateManyAsync(filter, addUpdate); // Remove duplicates from Grades array var pullUpdate = Builders<Restaurant>.Update .Pull(restaurant => restaurant.Grades, newGrades[0]); var result = await _restaurantsCollection.UpdateManyAsync(filter, pullUpdate); return result;
複数の値のすべてのインスタンス
配列から複数の特定の値のすべてのインスタンスを削除するには、Builders.Update.PullAll() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 値を削除する配列フィールドを指定する式。 データ型: |
| 配列フィールドから削除する値。 データ型: |
次のコード例では、 PullAll() メソッドを使用して、2 つの特定の GradeEntry オブジェクトのすべてのインスタンスを一致するすべてのドキュメント内の Grades 配列から削除します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); // Add duplicate values to Grades array var newGrades = new List<GradeEntry> { new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95 }, new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95,}, new GradeEntry { Date = DateTime.MinValue, Grade = "B", Score = 85 }, new GradeEntry { Date = DateTime.MinValue, Grade = "B", Score = 85,} }; var addUpdate = Builders<Restaurant>.Update .PushEach("Grades", newGrades); _restaurantsCollection.UpdateMany(filter, addUpdate); // Remove duplicates from Grades array var gradesToRemove = new List<GradeEntry> { newGrades[0], newGrades[2] }; var pullUpdate = Builders<Restaurant>.Update .PullAll(restaurant => restaurant.Grades, gradesToRemove); var result = _restaurantsCollection.UpdateMany(filter, pullUpdate); return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); // Add duplicate values to Grades array var newGrades = new List<GradeEntry> { new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95 }, new GradeEntry { Date = DateTime.MinValue, Grade = "A", Score = 95,}, new GradeEntry { Date = DateTime.MinValue, Grade = "B", Score = 85 }, new GradeEntry { Date = DateTime.MinValue, Grade = "B", Score = 85,} }; var addUpdate = Builders<Restaurant>.Update .PushEach("Grades", newGrades); await _restaurantsCollection.UpdateManyAsync(filter, addUpdate); // Remove duplicates from Grades array var gradesToRemove = new List<GradeEntry> { newGrades[0], newGrades[2] }; var pullUpdate = Builders<Restaurant>.Update .PullAll(restaurant => restaurant.Grades, gradesToRemove); var result = await _restaurantsCollection.UpdateManyAsync(filter, pullUpdate); return result;
条件に一致するすべての値
配列から特定の条件に一致するすべての値を削除するには、Builders.Update.PullFilter() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| 値を削除する配列フィールドを指定する式。 データ型: |
| 削除する値の条件を指定するクエリフィルター。 データ型: FilterDefinition<TItem> |
次のコード例では、 PullFilter() メソッドを使用して、Grade の値が "F" であるすべての GradeEntry オブジェクトを一致するドキュメント内の Grades 配列から削除します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); // Add GradeEntry values with "Grade = F" to Grades array var newGrades = new List<GradeEntry> { new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 10 }, new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 21,}, new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 47 }, new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 6,} }; var addUpdate = Builders<Restaurant>.Update .PushEach("Grades", newGrades); _restaurantsCollection.UpdateMany(filter, addUpdate); // Remove all "Grade = F" values from Grades array var pullUpdate = Builders<Restaurant>.Update .PullFilter(restaurant => restaurant.Grades, gradeEntry => gradeEntry.Grade == "F"); var result = _restaurantsCollection.UpdateMany(filter, pullUpdate); return result;
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); // Add GradeEntry values with "Grade = F" to Grades array var newGrades = new List<GradeEntry> { new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 10 }, new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 21,}, new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 47 }, new GradeEntry { Date = DateTime.Now, Grade = "F", Score = 6,} }; var addUpdate = Builders<Restaurant>.Update .PushEach("Grades", newGrades); await _restaurantsCollection.UpdateManyAsync(filter, addUpdate); // Remove all "Grade = F" values from Grades array var pullUpdate = Builders<Restaurant>.Update .PullFilter(restaurant => restaurant.Grades, gradeEntry => gradeEntry.Grade == "F"); var result = await _restaurantsCollection.UpdateManyAsync(filter, pullUpdate); return result;
一致する値の更新
配列フィールドの値を更新するには、Builders.Update.Set() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:
Parameter | 説明 |
|---|---|
| アップデートする配列フィールドを指定する式。 データ型: |
| 配列フィールドに設定する新しい値。 データ型: |
位置演算子 をSet() メソッドで使用して、配列内の特定の値をクエリしてアップデートできます。 LINQ3 プロバイダーを使用している場合、 .NET/ C#ドライバーは位置演算子の代わりに LINQ構文もサポートしています。
次のセクションでは、配列フィールド内の一致する値をアップデートするさまざまな方法について説明します。
最初に一致する値
配列の最初の値を更新するには、位置演算子($)または LINQ構文 のいずれかを使用できます。 対応する構文を表示するには、Positional Operator タブまたは LINQタブを選択します。
次の例では、 Set() メソッドと位置演算子 を使用して、一致するすべてのドキュメント内の Grades 配列をアップデートします。 GradeEntryまず、Grades 配列内で、Grade プロパティの値が である最初の"A" オブジェクトのみが検索されます。次に、最初に一致する GradeEntryオブジェクトの Scoreプロパティを100 にアップデートします。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli") & Builders<Restaurant>.Filter.Eq("grades.grade", "A"); // Set Score = 100 in first GradeEntry where Grade = "A" var update = Builders<Restaurant>.Update .Set("grades.$.score", 100); var result = _restaurantsCollection.UpdateMany(filter, update); return result;
注意
位置演算子を使用するには、配列フィールドがクエリフィルターの一部である必要があります。
次の例では、 Set() メソッドと位置演算子 を使用して、一致するすべてのドキュメント内の Grades 配列をアップデートします。 GradeEntryまず、Grades 配列内で、Grade プロパティの値が である最初の"A" オブジェクトのみが検索されます。次に、最初に一致する GradeEntryオブジェクトの Scoreプロパティを100 にアップデートします。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli") & Builders<Restaurant>.Filter.Eq("grades.grade", "A"); // Set Score = 100 in first GradeEntry where Grade = "A" var update = Builders<Restaurant>.Update .Set("grades.$.score", 100); var result = await _restaurantsCollection.UpdateManyAsync(filter, update); return result;
注意
位置演算子を使用するには、配列フィールドがクエリフィルターの一部である必要があります。
次の例では、 Set() メソッドと FirstMatchingElement() メソッドを使用して、一致するすべてのドキュメントの Grades 配列をアップデートします。 GradeEntryまず、Grades 配列内で、Grade プロパティの値が である最初の"A" オブジェクトのみが検索されます。次に、最初に一致する GradeEntryオブジェクトの Scoreプロパティを100 にアップデートします。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli") & Builders<Restaurant>.Filter.Eq("grades.grade", "A"); // Set Score = 100 in first GradeEntry where Grade = "A" var update = Builders<Restaurant>.Update .Set(restaurant => restaurant.Grades.FirstMatchingElement().Score, 100); var result = _restaurantsCollection.UpdateMany(filter, update); return result;
次の例では、 Set() メソッドと FirstMatchingElement() メソッドを使用して、一致するすべてのドキュメントの Grades 配列をアップデートします。 GradeEntryまず、Grades 配列内で、Grade プロパティの値が である最初の"A" オブジェクトのみが検索されます。次に、最初に一致する GradeEntryオブジェクトの Scoreプロパティを100 にアップデートします。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli") & Builders<Restaurant>.Filter.Eq("grades.grade", "A"); // Set Score = 100 in first GradeEntry where Grade = "A" var update = Builders<Restaurant>.Update .Set(restaurant => restaurant.Grades.FirstMatchingElement().Score, 100); var result = await _restaurantsCollection.UpdateManyAsync(filter, update); return result;
すべて一致する値
指定された条件に一致する配列内のすべての値を更新するには、フィルタリングされた位置演算子($[<identifier>])または LINQ構文 のいずれかを使用できます。 対応する構文を表示するには、Positional Operator タブまたは LINQタブを選択します。
次の例では、 Set() メソッドとフィルタリングされた位置演算子を使用して、Grades 配列内の一致するすべての GradeEntry オブジェクトの Scoreプロパティを、一致するすべてのドキュメントの 100 に更新します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var arrayFilters = new List<ArrayFilterDefinition> { new BsonDocumentArrayFilterDefinition<Restaurant>( new BsonDocument { { "gradeEntry.score", new BsonDocument { { "$gte", 94} } } }) }; // Set Grade = "A" in all GradeEntry objects where Score >= 94 var update = Builders<Restaurant>.Update .Set("grades.$[gradeEntry].grade", "A"); var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters }; var result = _restaurantsCollection.UpdateMany(filter, update, updateOptions); return result;
次の例では、 Set() メソッドとフィルタリングされた位置演算子を使用して、Grades 配列内の一致するすべての GradeEntry オブジェクトの Scoreプロパティを、一致するすべてのドキュメントの 100 に更新します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var arrayFilters = new List<ArrayFilterDefinition> { new BsonDocumentArrayFilterDefinition<Restaurant>( new BsonDocument { { "gradeEntry.score", new BsonDocument { { "$gte", 94} } } }) }; // Set Grade = "A" in all GradeEntry objects where Score >= 94 var update = Builders<Restaurant>.Update .Set("grades.$[gradeEntry].grade", "A"); var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters }; var result = await _restaurantsCollection.UpdateManyAsync(filter, update, updateOptions); return result;
次の例では、 Set() メソッドと AllMatchingElements() メソッドを使用して、Grades 配列内の一致するすべての GradeEntry オブジェクトの Scoreプロパティを、一致するすべてのドキュメントの 100 に更新します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var arrayFilters = new List<ArrayFilterDefinition> { new BsonDocumentArrayFilterDefinition<Restaurant>( new BsonDocument { { "gradeEntry.score", new BsonDocument { { "$gte", 94} } } }) }; // Set Grade = "A" in all GradeEntry objects where Score >= 94 var update = Builders<Restaurant>.Update .Set(restaurant => restaurant.Grades.AllMatchingElements("gradeEntry").Grade, "A"); var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters }; var result = _restaurantsCollection.UpdateMany(filter, update, updateOptions); return result;
次の例では、 Set() メソッドと AllMatchingElements() メソッドを使用して、Grades 配列内の一致するすべての GradeEntry オブジェクトの Scoreプロパティを、一致するすべてのドキュメントの 100 に更新します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); var arrayFilters = new List<ArrayFilterDefinition> { new BsonDocumentArrayFilterDefinition<Restaurant>( new BsonDocument { { "gradeEntry.score", new BsonDocument { { "$gte", 94} } } }) }; // Set Grade = "A" in all GradeEntry objects where Score >= 94 var update = Builders<Restaurant>.Update .Set(restaurant => restaurant.Grades.AllMatchingElements("gradeEntry").Grade, "A"); var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters }; var result = await _restaurantsCollection.UpdateManyAsync(filter, update, updateOptions); return result;
All Values
クエリフィルターに一致する配列内のすべての値をアップデートするには、すべての位置演算子($[])または LINQ構文 のいずれかを使用できます。 対応する構文を表示するには、Positional Operator タブまたは LINQタブを選択します。
次の例では、 Set() メソッドとすべての位置演算子を使用して、Grades 配列内のすべての GradeEntry オブジェクトの Scoreプロパティを、一致するすべてのドキュメントの 100 にアップデートします。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); // Set Score = 100 in all GradeEntry objects var update = Builders<Restaurant>.Update .Set("grades.$[].score", 100); var result = _restaurantsCollection.UpdateMany(filter, update); return result;
次の例では、 Set() メソッドとすべての位置演算子を使用して、Grades 配列内のすべての GradeEntry オブジェクトの Scoreプロパティを、一致するすべてのドキュメントの 100 にアップデートします。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); // Set Score = 100 in all GradeEntry objects var update = Builders<Restaurant>.Update .Set("grades.$[].score", 100); var result = await _restaurantsCollection.UpdateManyAsync(filter, update); return result;
次の例では、 Set() メソッドと AllElements() メソッドを使用して、Grades 配列内のすべての GradeEntry オブジェクトの Scoreプロパティを、一致するすべてのドキュメントの 100 に更新します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); // Set Score = 100 in all GradeEntry objects var update = Builders<Restaurant>.Update .Set(restaurant => restaurant.Grades.AllElements().Score, 100); var result = _restaurantsCollection.UpdateMany(filter, update); return result;
次の例では、 Set() メソッドと AllElements() メソッドを使用して、Grades 配列内のすべての GradeEntry オブジェクトの Scoreプロパティを、一致するすべてのドキュメントの 100 に更新します。
var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); // Set Score = 100 in all GradeEntry objects var update = Builders<Restaurant>.Update .Set(restaurant => restaurant.Grades.AllElements().Score, 100); var result = await _restaurantsCollection.UpdateManyAsync(filter, update); return result;
API ドキュメント
このガイドで説明したメソッドやタイプの詳細については、次の API ドキュメントを参照してください。