javascript - Mongoose 仅​​更新已定义的文档值

标签 javascript node.js express mongoose

我只想更新文档中新定义的值。如果未定义,请保留文档中的值。下面的例子。

如果该文档存在于数据库中

{
  "_id": "592c53b3bdf350ce004ad717",
  "url": "hyoh7ryb-",
  "fname": "Foo",
  "lname": "Bar",
  "email": "foobar@gmail.com",
  "__v": 0,
  "verfied": false,
  "bio": {
    "title": "Software Engineer",
    "intro": "I like to code stuff.",
    "summary": "Specializing in web development. Favorite language is Javascript.\n"
  }
}

我的代码:

module.exports.updateBio = function(req, res) {


    var userID = req.params.id;
    var objForUpdate = {bio: {}};

    if (!app.isEmptyString(req.body.profile_picture)) objForUpdate.bio.profile_picture = req.body.profile_picture;
    if (!app.isEmptyString(req.body.title))           objForUpdate.bio.title = req.body.title;
    if (!app.isEmptyString(req.body.intro))           objForUpdate.bio.intro = req.body.intro;
    if (!app.isEmptyString(req.body.summary))         objForUpdate.bio.summary = req.body.summary;   
    if (!app.isEmptyString(req.body.skills))          objForUpdate.bio.skills = req.body.skills;
    if (!app.isEmptyString(req.body.facebook))        objForUpdate.bio.social.facebook = req.body.facebook;
    if (!app.isEmptyString(req.body.twitter))         objForUpdate.bio.social.twitter = req.body.twitter;
    if (!app.isEmptyString(req.body.linkedin))        objForUpdate.bio.social.linkedin = req.body.linkedin;
    if (!app.isEmptyString(req.body.website))         objForUpdate.bio.social.website = req.body.website;

    var conditions = { _id: userID }
      , setObj = { $set: objForUpdate }
      , options = { multi: true };

    Profile.update(conditions, setObj, (error, page) =>{
        if(error) return res.status(500).json({ success: false, error: error });

        res.status(200).json({ success: true, message: "Bio successfully updated." });
    });
};

在我的正文发送请求中,我仅更新标题,但我希望按原样保留所有其他生物信息,但它会为它们创建一个空白字段。

我该如何处理这个问题?

最佳答案

嵌套对象(如bio)的设置语法是:

$set: {'bio.profile_picture': 20}

所以试试这个:

module.exports.updateBio = function(req, res) {


    var userID = req.params.id;
    var objForUpdate = {};

    if (!troolr.isEmptyString(req.body.profile_picture)) objForUpdate['bio.profile_picture'] = req.body.profile_picture;
    if (!troolr.isEmptyString(req.body.title))           objForUpdate['bio.title'] = req.body.title;
    if (!troolr.isEmptyString(req.body.intro))           objForUpdate['bio.intro'] = req.body.intro;
    if (!troolr.isEmptyString(req.body.summary))         objForUpdate['bio.summary'] = req.body.summary;   
    if (!troolr.isEmptyString(req.body.skills))          objForUpdate['bio.skills'] = req.body.skills;
    if (!troolr.isEmptyString(req.body.facebook))        objForUpdate['bio.social.facebook'] = req.body.facebook;
    if (!troolr.isEmptyString(req.body.twitter))         objForUpdate['bio.social.twitter'] = req.body.twitter;
    if (!troolr.isEmptyString(req.body.linkedin))        objForUpdate['bio.social.linkedin'] = req.body.linkedin;
    if (!troolr.isEmptyString(req.body.website))         objForUpdate['bio.social.website'] = req.body.website;

    var conditions = { _id: userID }
      , setObj = { $set: objForUpdate }
      , options = { multi: true };

    Profile.update(conditions, setObj, (error, page) =>{
        if(error) return res.status(500).json({ success: false, error: error });

        res.status(200).json({ success: true, message: "Bio successfully updated." });
    });
};

关于javascript - Mongoose 仅​​更新已定义的文档值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44248450/

相关文章:

javascript - 如何使用 javascript 从tinyMCE 获取我的格式化内容?

javascript - 如何在 prettyPhoto Image Viewer 中设置缩略图

javascript - 在 HTML5 Canvas 中高效还原 RGB

Node.js Express DELETE 路由不起作用

angularjs - 如何将数组发送到 API 调用中以设置对象列表 - Angular

javascript - Express.js 找不到样式表

javascript - 用于匹配 package.json 内容中的模块的正则表达式

javascript - 如何使用 NodeJS 将旧的 json 对象替换为新的 json 对象

c++ - *v8::String::Utf8Value(args[0]->ToString()) 不返回 node.js 插件参数的字符串

node.js - 如果 MongoDB 中已存在索引,则忽略 Mongoose 模式中的过期设置