如何仅更新MongoDB数据库中对象的某些属性

时间:2017-08-07 05:03:19

标签: javascript node.js express mongoose ecmascript-6

我的代码不允许API用户通过传递一个请求属性来仅更新一个字段。我可以在userObj删除null,但UI开发人员必须从数据库传递现有数据才能进行更新,这不是最佳做法。

这是我的快递路线:

router.put('/user', (req, res) => {
  const userObj = {
    name: req.body.name || null,
    location: {
      city: req.body.city || null
      },
      phone: req.body.phone || null
    };

  User.updateUser(req.body.id, userObj)
});

这是我的Mongoose模型的updateUser功能:

module.exports.updateUser = (_id, userObj, callback) => {
  User.findOneAndUpdate({_id}, userObj, { upsert: true, 'new': true }, callback);
}

2 个答案:

答案 0 :(得分:6)

首先,要解决仅更新几个特定属性的问题,您必须使用$set运算符来仅设置某个字段。当您将userObj直接传递给findOneAndUpdate时,您将重置整个对象,因此您必须传递所有现有属性。使用$set

User.findOneAndUpdate({_id}, { $set: userObj }, { upsert: true, new: true }, callback);

这只会将userObj中定义的属性更新为新值,而不会触及任何其他内容。此外,您可以使用findByIdAndUpdate来处理这个用例:

User.findByIdAndUpdate(_id, { $set: userObj }, { upsert: true, new: true }, callback);

接下来,您不应该使用PUT。使用PATCH。 PUT意味着将资源放在某个URL上,如果它已经存在则完全替换它。 PATCH意味着您只更新资源的一些属性,并确实替换整个属性。这不会影响应用程序的功能,但它是一个巨大的语义问题和最终用户问题,因为他们期望PATCH。

答案 1 :(得分:0)

使用$set

User.findOneAndUpdate({_id}, {$set: userObj}, /* ... */)