C#MongoDB – 如何在多个嵌套数组元素中添加和删除项目?

我在MongoDB中有一个看起来像这样的文档:

{ "Id":"123", "Product": "test", "Tags":[ { "Name": "name", "Categories": [ { //item }, { //item } ] }, { "Name": "name", "Categories": [ { //item }, { //item } ] } ] } 

现在,我需要添加一个新Item ,它需要通过其Id添加到该ProductTags元素的所有类别中。 例如,当我插入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);