如何根据可变请求数据智能地更新Mongoose文档?

时间:2019-06-20 02:09:46

标签: node.js mongodb mongoose mongodb-query

对于我的Edit用户路线,我将需要处理许多不同的情况。用户可以更新其个人资料,仅更改其电子邮件地址或密码,但他们也可以一次更新整个其他个人资料信息。

findOneAndUpdate的优点是您可以传递更新对象,并且它只会更改请求中与已保存数据不同的那些字段。这很棒!一个巨大的问题-该查询出于某种原因绕过了验证程序和中间件(即使使用runValidators=true,它也绕过了预保存的钩子,这意味着密码更新绕过了加密)。

因此,我到处都看到的解决方案是执行findOnefindById,手动更新字段,然后运行user.save()

但是,由于用户记录相当复杂,这意味着我的路线看起来像这样,并且很难维护:

exports.editUser = async function(req, res, next) {
  try {
    const id = req.params.id;
    let user = await db.User.findById(id);
    user.email = req.body.email;
    user.fullName = req.body.fullName;
    user.password = req.body.password;
    user.otherField = req.body.otherField;
    user.otherField = req.body.otherField;
    user.otherField = req.body.otherField;
    user.otherField = req.body.otherField;
    user.otherField = req.body.otherField;
    user.otherField = req.body.otherField;
    user.otherField = req.body.otherField;
    user.otherField = req.body.otherField;
    user.otherField = req.body.otherField;
    user.otherField = req.body.otherField;
    user.otherField = req.body.otherField;
    let updatedUser = await user.save();
    return res.status('200').json(user); 
  }

是否有任何方法可以模仿将更新对象传递给Mongoose的行为,在这里我可以给它req.body并让它仅更新不同的字段?

1 个答案:

答案 0 :(得分:1)

https://lodash.com/docs/4.17.11#merge

_。merge(用户,要求正文)

这将合并“一切”。仅在不关心安全性的情况下使用。

要限制在某些领域而不会发疯:

const { f1, f2, f3 } = req.body;
_.merge(user, { f1, f2, f3}) 

或参考此:https://lodash.com/docs/4.17.11#pick
lodash的功能不太明显。

_.merge(user, _.pick(req.body, ['f1', 'f2', 'f3']))