如何更新另一个嵌入数据中的嵌入数据?

时间:2014-04-08 06:32:20

标签: mongodb

我在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但无法更新它。文档中的示例使用.$.更新嵌入数据结构中的值,但在我的情况下它不起作用。

有人有什么想法吗?

1 个答案:

答案 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}}})

使用此解决方案,您需要注意并发性,因为文档不存在会有短暂的时刻。