Добавить новое поле в коллекцию на основе других полей - PullRequest
1 голос
/ 07 февраля 2020

"MongoDB версия: 4.2 ОС: OSX

У меня есть следующий документ в коллекции Home:

{
    "_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, экстраполированное из devicesConfig поле:

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 операция удаляет все остальные, не указанные поля?

Спасибо!

1 Ответ

0 голосов
/ 07 февраля 2020

Вы должны использовать $ addFields с комбинацией $ project :

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