Mongo仅更新子文档中的一项,并在同一子文档中添加一项

时间:2019-09-09 16:02:01

标签: mongodb

这是我的document中的collection

{
        "_id" : ObjectId("5d766c18791adb12cc607d49"),
        "name" : "myapp",
        "openApp" : true,
        "appDeveloper" : "Arun",
        "environments" : [
                {
                        "environment_id" : ObjectId("5d766c18791adb12cc607d45"),
                        "environment_name" : "production_env_updated",
                        "environment_type" : "prod",
                        "services" : [
                                {
                                        "service_id" : ObjectId("5d766c18791adb12cc607d46"),
                                        "service_name" : "some_updated",
                                        "service_type" : "..."
                                },
                                {
                                        "service_id" : ObjectId("5d766d45791adb12cc607d4a"),
                                        "service_name" : "updated 2",
                                        "service_type" : "..."
                                }
                        ]
                },
                {
                        "environment_id" : ObjectId("5d766c18791adb12cc607d48"),
                        "environment_name" : "demo_env",
                        "environment_type" : "stage",
                        "services" : [
                                {
                                        "service_id" : ObjectId("5d766d45791adb12cc607d4b"),
                                        "service_name" : "perfectly new",
                                        "service_type" : "perfect"
                                }
                        ]
                }
        ]
}

我想运行一个查询,该查询只更新"service_id" : ObjectId("5d766c18791adb12cc607d46")中的services-array,然后添加一个新的service-object

我执行了以下查询,但不知道如何进一步

db.app_attributes.update ({"_id" : ObjectId("5d766c18791adb12cc607d49")}, 

{ '$set': {"environments.services.service_id" : ObjectId("5d766c18791adb12cc607d46") :  {
                                        "service_id" : ObjectId("5d766c18791adb12cc607d46"),
                                        "service_name" : "sdfsdf",
                                        "service_type" : "..."
                                }}} 
)

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您想更新service_idObjectId("5d766c18791adb12cc607d46")的子文档。

您可以使用Filtered Positional Operator

db.app_attributes.update(
    {"_id" : ObjectId("5d766c18791adb12cc607d49")}, 
    {
        $set: {
            "environments.$[].services.$[element]": {
                "service_id" : ObjectId("5d766c18791adb12cc607d46"),
                "service_name" : "Updated Service Name",
                "service_type" : "Updated Service Type"
            }
        }
    },
    {
        arrayFilters: [
            {"element.service_id": ObjectId("5d766c18791adb12cc607d46")}
        ], 
        multi: true
    }
)