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

Lir*_*man 1 c# mongodb mongodb-.net-driver

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

{
    "Id":"123",
    "Product": "test",
    "Tags":[
        {
            "Name": "name",
            "Categories": [
                {
                    //item
                },
                {
                    //item
                }
            ]
        },
        {
            "Name": "name",
            "Categories": [
                {
                    //item
                },
                {
                    //item
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

现在,我需要添加一个新的Item,它需要被添加到所有的类别Tags的该元素Product由它Id。例如,当我插入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
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

删除项目的方法与此相同,也需要将其从所有类别中删除。有没有一种方法可以使用C#MongoDB驱动程序来执行此操作,而无需拉出对象并“手动”更新它们?

use*_*814 6

您可以在3.6版本的2.5驱动程序中尝试以下操作。

查找具有filter条件的文档,该文档update包含新的位置标识符以更新UpdateOne方法内部数组中的多个元素。

$ []更新所有Tags数组,以在所有Categories数组中包括新项目。它充当占位符,用于更新数组中的所有元素。

var filter = Builders<Product>.Filter.Eq("Id", "123");
var update = Builders<Product>.Update.Push("Tags.$[].Categories", "Item 3");
var result = collection.UpdateOne(filter, update);
Run Code Online (Sandbox Code Playgroud)

var filter = Builders<Product>.Filter.Eq("Id", "123");
var update = Builders<Product>.Update.Pull("Tags.$[].Categories", "Item 3");
var result = collection.UpdateOne(filter, update);
Run Code Online (Sandbox Code Playgroud)

附加信息:

您可以设置用于在嵌套数组上应用查询条件的ArrayFilters选项,UpdateOptions以控制要更新的元素。

例如,更新每个标签都有Name名称的“ 标签”数组中的所有类别。

var filter = Builders<Product>.Filter.Eq("Id", "123");
var update = Builders<Product>.Update.Push("Tags.$[t].Categories", "Item 3");
var arrayFilters = new List<ArrayFilterDefinition>{ new ArrayFilterDefinition(new BsonDocument("t.Name", "name")) };
var updateOptions = new UpdateOptions({ArrayFilters = arrayFilters});
var result = collection.UpdateOne(filter, update, updateOptions);
Run Code Online (Sandbox Code Playgroud)