Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 基于其他字段向集合添加新字段_Mongodb_Pipeline - Fatal编程技术网

Mongodb 基于其他字段向集合添加新字段

Mongodb 基于其他字段向集合添加新字段,mongodb,pipeline,Mongodb,Pipeline,“MongoDB版本:4.2 操作系统:OSX 我在家里收藏了以下文件: { "_id" : "xxxx", "name" : "home1", "homeName" : "home1", "allowAdminActions" : true, "_created_at" : ISODate("2020-02-07T14:55:06.819Z"), "_updated_at" : ISODate("2020-02-07T14:55:12.356Z"

“MongoDB版本:4.2 操作系统:OSX

我在家里收藏了以下文件:

{
    "_id" : "xxxx",
    "name" : "home1",
    "homeName" : "home1",
    "allowAdminActions" : true,
    "_created_at" : ISODate("2020-02-07T14:55:06.819Z"),
    "_updated_at" : ISODate("2020-02-07T14:55:12.356Z"),
    "_p_Owner" : "xxxxx",
    "allowUpdate" : false,
    "devicesConfig" : {
        "hello" : 1,
        "deviceConfig" : {
            "data" : [
                {
                    "type" : "CommunicationConfig",
                    "wifiName" : "wifitest",
                    "wifiPassword" : "wifipassword"
                }
            ]
        }
    }
}
然后我想创建一个名为
wifiName
的字段,该字段是从
DeviceConfig
字段推断出来的:

db.Home.update(
    {},
    [
        {"$project": {"connConfig": {$arrayElemAt: ["$devicesConfig.deviceConfig.data", 0]}}},
        {"$set":  {"wifiName": "$connConfig.wifiName"}}
    ],
    false,
    true
)
预期结果将是:

{
    "_id" : "xxxx",
    "name" : "home1",
    "homeName" : "home1",
    "allowAdminActions" : true,
    "_created_at" : ISODate("2020-02-07T14:55:06.819Z"),
    "_updated_at" : ISODate("2020-02-07T14:55:12.356Z"),
    "_p_Owner" : "xxxx",
    "allowUpdate" : false,
    "devicesConfig" : {
        "hello" : 1,
        "deviceConfig" : {
            "data" : [
                {
                    "type" : "CommunicationConfig",
                    "wifiName" : "wifitest",
                    "wifiPassword" : "wifipassword"
                }
            ]
        }
    },
    "wifiName" : "wifitest"
}
实际结果是:

{
    "_id" : "xxxxx",
    "connConfig" : {
        "type" : "CommunicationConfig",
        "wifiName" : "testwifi",
        "wifiPassword" : "testpassword"
    },
    "wifiName" : "testwifi"
}
如何避免
update
操作删除所有其他未指定的字段

谢谢!

您应该结合使用:

您应结合以下各项使用:

db.Home.update(
    {},
    [
        {"$addFields": {"connConfig": {$arrayElemAt: ["$devicesConfig.deviceConfig.data", 0]}}},
        {"$set":  {"wifiName": "$connConfig.wifiName"}},
        {'$project' : {'connConfig': 0}}
    ],
    false,
    true
)