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

时间:2017-12-28 15:16:17

标签: c# mongodb mongodb-.net-driver

我在MongoDB中有一个类似的文档:

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

现在,我需要添加一个新的Item,并且需要将Tags添加到Product的{​​{1}}元素的所有类别中。 例如,当我插入Id时,文档应如下所示:

Item 3

同样适用于删除项目,也需要从所有类别中删除。 有没有办法用C#MongoDB驱动程序做到这一点而不拉动对象和"手动"更新它们?

1 个答案:

答案 0 :(得分:4)

您可以尝试使用3.6版本的2.5驱动程序中的以下内容。

查找包含filter条件的文档和update,其中包含新的positional identifier,以更新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);

拉​​

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

其他信息:

您可以在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);