我在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驱动程序做到这一点而不拉动对象和"手动"更新它们?
答案 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);