Update Arrays in Many Documents
項目一覧
Overview
このページでは、配列フィールド用の UpdateDefinition
オブジェクトを作成する方法を学びます。 UpdateDefinition
オブジェクトは、実行する更新操作の種類、更新するフィールド、および各フィールドの新しい値を指定します(該当する場合)。
.NET/ C#ドライバーは、 MongoDB Serverマニュアル に記載されている配列アップデート演算子と修飾子をサポートしています。これらの演算子の 1 つに対して UpdateDefinition
オブジェクトを作成するには、Builders.Update
プロパティから対応するメソッドを呼び出します。 次のセクションでは、これらの方法について詳しく説明します。
UpdateDefinition
オブジェクトを作成したら、それを UpdateMany()
メソッドまたは UpdateManyAsync()
メソッドに渡します。 これらのメソッドの詳細については、 UpdateMany ページを参照してください。
注意
メソッドのオーバーロード
このページのメソッドの多くには、複数のオーバーロードがあります。 このガイドの例では、各メソッドの 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 つの値を追加
配列の末尾に 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;
配列の末尾に 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 ドキュメントを参照してください。