C#MongoDB – 如何在多个嵌套数组元素中添加和删除项目?
我在MongoDB中有一个看起来像这样的文档:
{ "Id":"123", "Product": "test", "Tags":[ { "Name": "name", "Categories": [ { //item }, { //item } ] }, { "Name": "name", "Categories": [ { //item }, { //item } ] } ] }
现在,我需要添加一个新Item
,它需要通过其Id
添加到该Product
的Tags
元素的所有类别中。 例如,当我插入Item 3
,文档应如下所示:
{ "Id":"123", "Product": "test", "Tags":[ { "Name": "name", "Categories": [ { //item 1 }, { //item 2 }, { //item 3 } ] }, { "Name": "name", "Categories": [ { //item 1 }, { //item 2 }, { //item 3 } ] } ] }
同样适用于删除项目,它也需要从所有类别中删除。 有没有办法用C#MongoDB驱动程序这样做而不拉动对象并“手动”更新它们?
您可以在2.5版本的2.5驱动程序中尝试类似下面的内容。
查找具有filter
条件的文档和update
,其中包含新的位置标识符,以更新UpdateOne
方法内的数组中的多个元素。
$ []更新所有Tags
数组以在所有Categories
数组中包含新项。 它充当占位符,用于更新数组中的所有元素。
推
var filter = Builders.Filter.Eq("Id", "123"); var update = Builders .Update.Push("Tags.$[].Categories", "Item 3"); var result = collection.UpdateOne(filter, update);
拉
var filter = Builders.Filter.Eq("Id", "123"); var update = Builders .Update.Pull("Tags.$[].Categories", "Item 3"); var result = collection.UpdateOne(filter, update);
附加信息:
您可以在ArrayFilters
中设置ArrayFilters
选项,以便在嵌套数组上应用查询条件,以控制要更新的元素。
例如,更新标签数组中的所有类别,其中每个标签都具有Name
名称。
var filter = Builders.Filter.Eq("Id", "123"); var update = Builders .Update.Push("Tags.$[t].Categories", "Item 3"); var arrayFilters = new List{ new ArrayFilterDefinition(new BsonDocument("t.Name", "name")) }; var updateOptions = new UpdateOptions({ArrayFilters = arrayFilters}); var result = collection.UpdateOne(filter, update, updateOptions);