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

标签 javascript node.js express mongoose ecmascript-6

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

这是我的 express 路线:

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);
}

最佳答案

首先,要解决仅更新少数特定属性的问题,您必须使用 $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。使用补丁。 PUT 意味着将资源放在某个 URL 上,如果它已经存在则完全替换它。 PATCH 意味着您只更新资源的几个属性,并替换整个资源。这不会影响应用程序的功能,但这是一个巨大的语义问题和最终用户问题,正如他们所期望的 PATCH。

关于javascript - 如何仅更新 MongoDB 数据库中对象的某些属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45539709/

相关文章:

sql-server - 如何使用 Node.JS 防止 SQL 注入(inject)?

javascript - json对象根据传入的键更改值函数

javascript - 在 contenteditable 元素中,在 HTML 标记之间移动光标

javascript - 如何在 Typescript 中模拟 Cognito 响应

javascript - 检查字符串数组是否包含javascript中给定字符串的子字符串?

node.js - Nodejs Express hbs : css MIMETYPE turns into text/html

javascript - Chai 重用系列期待

node.js - 如何使用从 OIDCStrategy 检索到的 accessToken 来遍历 Azure Graph API?

mysql - 如何在 Node.js 中发送多个响应

javascript - 使用 POST 方法时 Node.js req.body 为空