如何更新mongodb中的嵌套数组值?

时间:2014-12-21 11:28:35

标签: json mongodb

我想要更新嵌套在数组值中的数组值:即set

status = enabled

其中alerts.id = 2

{
    "_id" : ObjectId("5496a8ed49847b6cd7c7b350"),
    "name" : "joe",
    "locations" : [ 
        {
            "name": "my location",
            "alerts" : [ 
                {
                    "id" : 1,
                    "status" : null
                }, 
                {
                    "id" : 2,
                    "status" : null
                }
            ]
        }
    ]
}

我会使用位置$字符,但不能在语句中使用它两次 - 还不支持多位置运算符:https://jira.mongodb.org/browse/SERVER-831

如何发出声明以仅更新ID为2的警报的状态字段?

更新

如果我按如下方式更改架构:

{
    "_id" : ObjectId("5496ab2149847b6cd7c7b352"),
    "name" : "joe",
    "locations" : {
        "my location" : {
            "alerts" : [ 
                {
                    "id" : 1,
                    "status" : "enabled"
                }, 
                {
                    "id" : 2,
                    "status" : "enabled"
                }
            ]
        },
        "my other location" : {
            "alerts" : [ 
                {
                    "id" : 3,
                    "status" : null
                }, 
                {
                    "id" : 4,
                    "status" : null
                }
            ]
        }
    }
}

然后我可以使用:

update({"locations.my location.alerts.id":1},{$set: {"locations.my location.alerts.$.status": "enabled"}});

问题是我无法在警报ID上创建索引: - (

2 个答案:

答案 0 :(得分:1)

最好这样建模,特别是如果需要位置和/或alerts.id的索引。

{
    "_id" : ObjectId("5496a8ed49847b6cd7c7b350"),
    "name" : "joe",
    "location" : "myLocation",
    "alerts" : [{
                    "id" : 1,
                    "status" : null
                }, 
                {
                    "id" : 2,
                    "status" : null
                }
            ]
}




{
    "_id" : ObjectId("5496a8ed49847b6cd7c7b350"),
    "name" : "joe",
    "location" : "otherLocation",
    "alerts" : [{
                    "id" : 1,
                    "status" : null
                }, 
                {
                    "id" : 2,
                    "status" : null
                }
            ]
}

答案 1 :(得分:-1)

我认为你的工作有错误的工具。您的示例中的内容是关系数据,并且使用关系数据库处理起来要容易得多。所以我建议使用SQL-database而不是mongo。

但是如果你真的想用mongo做,那么我想唯一的选择是获取文件并修改它并将其放回去。