AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

多くのドキュメントの配列を更新

このページでは、配列フィールド用の UpdateDefinition オブジェクトを作成する方法を学びます。 UpdateDefinitionオブジェクトは、実行する更新操作の種類、更新するフィールド、および各フィールドの新しい値を指定します(該当する場合)。

.NET/ C#ドライバーは、 MongoDB Serverマニュアル に記載されている配列アップデート演算子と修飾子をサポートしています。これらの演算子の 1 つに対して UpdateDefinitionオブジェクトを作成するには、Builders.Updateプロパティから対応するメソッドを呼び出します。 次のセクションでは、これらの方法について詳しく説明します。

UpdateDefinitionオブジェクトを作成したら、それを UpdateMany() メソッドまたは UpdateManyAsync() メソッドに渡します。 これらのメソッドの詳細については、「 多数更新 」ページを参照してください。

注意

メソッドのオーバーロード

このページのメソッドの多くには、複数のオーバーロードがあります。このガイドの例では、各メソッドの 1 つの定義のみを示します。利用可能なオーバーロードの詳細については、APIドキュメントを参照してください。

このガイドの例では、 sample_restaurantsデータベースのrestaurantsコレクションを使用します。 このコレクションのドキュメントでは、次のRestaurant 、 Address 、 GradeEntryクラスをモデルとして使用します。

public class Restaurant{ public ObjectId Id { get; set; } public string Name { get; set; } [BsonElement("restaurant_id")] 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; } [BsonElement("coord")] public double[] Coordinates { get; set; } public string Street { get; set; } [BsonElement("zipcode")] 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 つの値を追加するには、Builders.Update.Push() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:

Parameter
説明

field

値を追加する配列フィールドを指定する式。

データ型: Expression<Func<TDocument, IEnumerable<TItem>>>

value

配列フィールドの末尾に追加する値。

データ型: TItem

次のコード例では、 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;

Tip

プッシュ操作の構成

配列内の特定の位置に値を追加したり、配列を更新した後に配列をソートしたりスライスしたりするには、代わりに RustEach() メソッドを呼び出します。

配列の末尾に 1 つの値を追加するには、配列内にまだ存在しない場合のみ、 Builders.Update.AddToSet()メソッドを呼び出します。MongoDB Server は、値のBSON表現を配列内の各要素のBSON表現と比較して、値が配列に既に存在するかどうかを判断します。

AddToSet() メソッドは次のパラメーターを受け入れます:

Parameter
説明

field

値を追加する配列フィールドを指定する式。

データ型: Expression<Func<TDocument, IEnumerable<TItem>>>

value

配列フィールドの末尾に追加する値。

データ型: TItem

次のコード例では、 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;

配列に複数の値を追加するには、Builders.Update.PushEach() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:

Parameter
説明

field

1 つ以上の値を追加する配列フィールドを指定する式。

データ型: Expression<Func<TDocument, IEnumerable<TItem>>>

values

配列フィールドに追加する値。

データ型: IEnumerable<TItem>

slice

更新後に配列の先頭からカウントする、配列に保持する要素の数。 値が負の場合、メソッドは配列の末尾から指定された数の要素を保持します。

データ型: int?

position

配列内で値を追加する位置。 デフォルトでは 、 メソッドは配列の末尾に値を追加します。

データ型: int?

sort

新しい値を追加した後にドライバーが配列要素をソートする方法を指定する SortDefinitionオブジェクト。

データ型: 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;

配列に複数の値を追加するには、それらが配列にまだ存在しない場合にのみ、 Builders.Update.AddToSetEach()メソッドを呼び出します。このメソッドは次のパラメーターを受け入れます:

Parameter
説明

field

1 つ以上の値を追加する配列フィールドを指定する式。

データ型: Expression<Func<TDocument, IEnumerable<TItem>>>

values

配列フィールドに追加する値。

データ型: IEnumerable<TItem>

次のコード例では、 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;

次のセクションでは、配列フィールドから値を削除する方法について説明します。

配列から最初の値を削除するには、Builders.Update.PopFirst() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:

Parameter
説明

field

最初の値を削除する配列フィールドを指定する式。

データ型: Expression<Func<TDocument, IEnumerable<TItem>>>

次のコード例では、 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;

配列から最後の値を削除するには、Builders.Update.PopLast() メソッドを呼び出します。このメソッドは次のパラメータを受け入れます。

Parameter
説明

field

最後の値を削除する配列フィールドを指定する式。

データ型: Expression<Func<TDocument, IEnumerable<TItem>>>

次のコード例では、 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;

配列から特定の値のすべてのインスタンスを削除するには、Builders.Update.Pull() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:

Parameter
説明

field

値を削除する配列フィールドを指定する式。

データ型: Expression<Func<TDocument, IEnumerable<TItem>>>

value

配列フィールドから削除する値。

データ型: TItem

次のコード例では、Pull() メソッドを使用して、一致するすべてのドキュメント内の Grades 配列から特定の GradeEntryオブジェクトのすべてのインスタンスを削除します。

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); // Add duplicate values to Grades arrayvar 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 arrayvar pullUpdate = Builders<Restaurant>.Update .Pull(restaurant => restaurant.Grades, newGrades[0]); var result = _restaurantsCollection.UpdateMany(filter, pullUpdate); return result;

配列から複数の特定の値のすべてのインスタンスを削除するには、Builders.Update.PullAll() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:

Parameter
説明

field

値を削除する配列フィールドを指定する式。

データ型: Expression<Func<TDocument, IEnumerable<TItem>>>

values

配列フィールドから削除する値。

データ型: IEnumerable<TItem>

次のコード例では、 PullAll() メソッドを使用して、2 つの特定の GradeEntry オブジェクトのすべてのインスタンスを一致するすべてのドキュメント内の Grades 配列から削除します。

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); // Add duplicate values to Grades arrayvar 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 arrayvar 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;

配列から特定の条件に一致するすべての値を削除するには、Builders.Update.PullFilter() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:

Parameter
説明

field

値を削除する配列フィールドを指定する式。

データ型: Expression<Func<TDocument, IEnumerable<TItem>>>

filter

削除する値の条件を指定するクエリフィルター。

データ型: FilterDefinition<TItem>

次のコード例では、 PullFilter() メソッドを使用して、Grade の値が "F" であるすべての GradeEntry オブジェクトを一致するドキュメント内の Grades 配列から削除します。

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); // Add GradeEntry values with "Grade = F" to Grades arrayvar 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 arrayvar pullUpdate = Builders<Restaurant>.Update .PullFilter(restaurant => restaurant.Grades, gradeEntry => gradeEntry.Grade == "F"); var result = _restaurantsCollection.UpdateMany(filter, pullUpdate); return result;

配列フィールドの値を更新するには、Builders.Update.Set() メソッドを呼び出します。 このメソッドは次のパラメーターを受け入れます:

Parameter
説明

field

アップデートする配列フィールドを指定する式。

データ型: Expression<Func<TDocument, IEnumerable<TItem>>>

value

配列フィールドに設定する新しい値。

データ型: TItem

位置演算子 を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;

注意

位置演算子を使用するには、配列フィールドがクエリフィルターの一部である必要があります。

指定された条件に一致する配列内のすべての値を更新するには、フィルタリングされた位置演算子($[<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 >= 94var update = Builders<Restaurant>.Update .Set("grades.$[gradeEntry].grade", "A"); var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters };var result = _restaurantsCollection.UpdateMany(filter, update, updateOptions); return result;

クエリフィルターに一致する配列内のすべての値をアップデートするには、すべての位置演算子($[])または LINQ構文 のいずれかを使用できます。 対応する構文を表示するには、Positional Operator タブまたは LINQタブを選択します。

次の例では、 Set() メソッドとすべての位置演算子を使用して、Grades 配列内のすべての GradeEntry オブジェクトの Scoreプロパティを、一致するすべてのドキュメントの 100 にアップデートします。

var filter = Builders<Restaurant>.Filter.Eq("name", "Downtown Deli"); // Set Score = 100 in all GradeEntry objectsvar update = Builders<Restaurant>.Update .Set("grades.$[].score", 100); var result = _restaurantsCollection.UpdateMany(filter, update); return result;

このガイドで説明したメソッドやタイプの詳細については、次の API ドキュメントを参照してください。