【问题标题】:Is it possible to update a property of an embedded document in an embedded document (each in arrays)? [duplicate]是否可以更新嵌入文档中的嵌入文档的属性(每个都在数组中)? [复制]
【发布时间】:2015-02-03 11:09:31
【问题描述】:

考虑到这份文件:

{
    "_id" : ObjectId("54d0a5cdc9311cad167f55d5"),
    "Title" : "Add Solaris Zone",
    "Type" : "System",
    "Tasks" : [
            {
                    "TaskName" : "Ask for an IP",
                    "TaskDescription" : "Ask to network team for an ip adress",
                    "Custom" : [
                            {
                                    "id" : ObjectId("54d0a5cdc9311cad167f55d3"),
                                    "name" : "ip",
                                    "value" : ""
                            },
                            {
                                    "id" : ObjectId("54d0a5cdc9311cad167f55d4"),
                                    "name" : "vlan",
                                    "value" : ""
                            }
                    ],
                    "Prerequisites" : [ ]
            }

}

是否可以为 taksname = "Ask for an IP" 的任务更新属性“值”,比如说字段 ip?

我可以更新更高一级的属性(如 TaskName),但如果嵌入文档包含一组嵌入文档怎么办?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    通常要更新嵌套数组中的字段,您可以使用 $ 运算符。 http://docs.mongodb.org/manual/reference/operator/update/positional/

    但是,由于它只能使用一次,因此无法更新嵌套在嵌套数组中的数组元素。

    你可以做的(假设你知道“任务”元素的位置是什么)是指定位置,如:

    update({...}, { $set: {"Tasks.0.Custom.$.value": "MyVal"}})
    

    【讨论】:

    • 嗨,谢谢你的回答,我不知道任务元素的位置,所以我该怎么办:1)在我的应用程序中加载整个任务元素,编辑它并将其写回mongo , 2) 进行第一次查询以获取任务的位置(如果可能的话) 3) 更改我的数据库的设计(但我不认为这很糟糕)
    • 第二个选项不太好,因为有人可以在您读取和更新之间编辑元素 - 所以您会更新错误的元素。我会选择第一种或第三种选择,两者都很好。如果任务存在于主要元素之外是有意义的 - 那么第三个选项似乎不错。如果您在应用程序中加载整个聚合并使用它 - 第一个是要走的路
    • 我认为从主文档中获取任务是没有意义的,所以我会阅读整个文档,在我的应用程序中更新它并写回来。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2015-04-21
    • 1970-01-01
    相关资源
    最近更新 更多