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驱动程序来执行此操作,而无需拉出对象并“手动”更新它们?
您可以在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)
| 归档时间: |
|
| 查看次数: |
3012 次 |
| 最近记录: |