我在MongoDB中有如下文档:
{
"_id": "test",
"tasks": [
{
"Name": "Task1",
"Parameter": [
{
"Name": "para1",
"Type": "String",
"Value": "*****"
},
{
"Name": "para2",
"Type": "String",
"Value": "*****"
}
]
},
{
"Name": "Task2",
"Parameter": [
{
"Name": "para1",
"Type": "String",
"Value": "*****"
},
{
"Name": "para2",
"Type": "String",
"Value": "*****"
}
]
}
]
}
在另一个嵌入式数据结构(任务)中有嵌入式数据结构(参数)。现在我想更新Task1&#39的参数中的para1。
我尝试了很多方法,但我只能使用查询tasks.Parameter.name来查找para1但无法更新它。文档中的示例使用.$.
更新嵌入数据结构中的值,但在我的情况下它不起作用。
有人有什么想法吗?
答案 0 :(得分:0)
MongoDB目前仅支持位置运算符一次,并且仅支持顶级数组。有一个票据SERVER-831可以为您的用例更改此行为。您可以在那里关注该问题并进行投票。
但是,您可以改变自己的方法来完成自己想做的事情。一种方法是更改架构。将任务名称折叠到数组中,以使文档如下所示:
{
_id:test,
tasks:
[
{
Task:1
Name:para1,
Type:String,
Value:*****
},
{
Task:1
Name:para2,
Type:String,
Value:*****
},
{
Task:2
Name:para1,
Type:String,
Value:*****
},
{
Task:2
Name:para2,
Type:String,
Value:*****
}
]
}
另一种可能适合你的方法是使用$ pull和$ push。比如像这样替换任务(假设tasks.Parameter.Name对于参数数组是唯一的):
db.test2.update({$and: [{"tasks.Name": "Task3"}, {"tasks.Parameter.Name":"para1"}]}, {$pull: {"tasks.$.Parameter": {"Name": "para1"}}})
db.test2.update({"tasks.Name": "Task3"}, {$push: {"tasks.$.Parameter": {"Name": "para3", Type: "String", Value: 1}}})
使用此解决方案,您需要注意并发性,因为文档不存在会有短暂的时刻。