使用 findOneAndUpdate() 时,如何在未提供值的情况下保持字段不变(而不是用 null 覆盖)?

dan*_*674 5 javascript mongoose mongodb nosql node.js

用户可以选择更新几个值中的任何一个——但是,如果他只传入{ name: "new name" },电子邮件和密码字段也会更新,但为“空”。

我怎样才能只更新 req.body 中实际提供的字段,其余的保持原样?

这是同时指定可以使用 POST 请求更新哪些字段 - 我避免只传递 req.body 因为我想限制这一点。

我的代码看起来像:

db.User.findOneAndUpdate({_id: req.params.id}, { 
        name: req.body.name,
        email: req.body.emaill, 
        password: req.body.password
})
Run Code Online (Sandbox Code Playgroud)

使用类似 name: 的东西req.body.name && req.body.name来检查一个值是否未定义也会用“null”覆盖。

谢谢!

N-a*_*ate 11

首先准备更新对象:

let params = { 
        name: req.body.name,
        email: req.body.emaill, 
        password: req.body.password
};

for(let prop in params) if(!params[prop]) delete params[prop]; //This will not handle intentionally setting to false, empty string, null, 0, or other falsey values.

db.User.findOneAndUpdate({_id: req.params.id}, params);
Run Code Online (Sandbox Code Playgroud)

或者,如果您的属性名称匹配:

let params = {};

for(let prop in req.body) if(req.body[prop]) params[prop] = req.body[prop];

db.User.findOneAndUpdate({_id: req.params.id}, params);
Run Code Online (Sandbox Code Playgroud)