【问题标题】:updating just one element in a nested json document with mongoose使用 mongoose 仅​​更新嵌套 json 文档中的一个元素
【发布时间】:2020-03-05 06:26:10
【问题描述】:

当 json 元素嵌套时,如何使用 Mongoose 只更新文档中的一个片段?

我想更新一个文档,只需将“darkMode”从 false 设置为 true,而无需 GET 和 PUT 整个“设置”部分。 Mongoose 可以做到这一点吗?

        "settings": {
            "darkMode": false,
            "tipOfTheDay": true,
            "paperFormat": "DINA4",
        },

如果我 PUT,我将丢失文档“设置”部分中的所有内容:

        "settings": {
            "darkMode": true,
        },

我的 NodeJS 后端看起来像这样。我目前正在使用 findByIdAndUpdate 。也许有更好的方法?

exports.updateProfile = async (req, res, next) => {
    const profile = await Profile.findByIdAndUpdate(req.params.id, req.body, {
        new: true,
        runValidators: true
    });

    if (!profile) {
        return res.status(400).json({success: false});
    }

    res.status(200).json({success: true, data: profile});
}

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案1】:

为了更新嵌入文档中的字段,您必须使用 $set 运算符(因为您的文档是一个对象,我们正在处理对象中的一个对象)

来自 mongodb 文档:

https://docs.mongodb.com/v2.4/reference/method/db.collection.update/#update-specific-fields-in-embedded-documents

更新嵌入文档中的特定字段 使用点符号更新嵌入文档中的值。

所以对你来说,如果我们假设这里的 req.body 是 { darkMode: true } 那就是

    const profile = await Profile.findByIdAndUpdate(
     req.params.id, 
     { $set: { 'settings.darkMode': req.body.darkMode } }, 
     {
        new: true,
        runValidators: true
    });

但这一切都取决于您如何从客户端发送数据,如果您发送一个只包含修改字段的对象,那么您必须专门 $set 它们以保持其他值不变,如上。要自动执行此操作,您还可以使用花哨的循环构建查询:

let query = { $set: {} }

Object.keys(req.body).forEach(requestBodyKey => {
    let requestBodyFieldValue = req.body[requestBodyKey];
    query.$set[`settings.${requestBodyKey}`] = requestBodyFieldValue;
})

或者您可以先查询您的文档以获取 current_settings,然后使用 javascript 合并这两个对象(例如 {...myCurrentSettings, ...myNewerSettings } see spread operatorObject.assign()),然后更新它以确保您保持以前的不变, 字段值。

【讨论】:

    猜你喜欢
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2016-10-06
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多