为了账号安全,请及时绑定邮箱和手机立即绑定

Mongoose:仅在不为空时更新新值

Mongoose:仅在不为空时更新新值

慕田峪9158850 2022-01-13 16:34:55
我已经有了另一个解决方案,但不明白为什么我的不起作用。我尝试在这里使用 $set: 但它没有帮助。当我打印时,objForUpdate 确实返回“姓名,姓氏”。如果我用 {name, lastname} 替换 {objForUpdate} - 更新有效。但我不能在变量中传递参数。//Route to UPDATE user    async updateUser(req, res) {        let { _id, type, name, lastname } = req.body;        try {             let objForUpdate = "";             for (var key in req.body) {                 if (req.body.hasOwnProperty(key) && req.body.key !== null && req.body[key] !== "" && key !== '_id') {                     console.log("this is key: " + key + ", and this is value req.body[key]: " + req.body[key]);                     objForUpdate += key + ", ";                 }            }            objForUpdate = objForUpdate.slice(0, -2);             const updated = await Users.updateOne({ _id }, {objForUpdate});            res.send({ updated });        } catch (error) {            res.send({ error });        }    }
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

如果你要调试代码,你会得到它。

假设req.body看起来像{ name: "foo", lastname: "bar" type: "2", _id: 1},并且在 for 循环和切片操作的末尾objForUpdate"name, lastname, type"是一个string

现在,当您将此字符串传递给 updateOne 操作时,这部分{objForUpdate}将被转换为{ objForUpdate: "name, lastname, type" }(标识符作为键的转换,其定义的值作为该键的值)。

即使使用$set运算符,该更新对象也是不正确的。


如果我用 {name, lastname} 替换 {objForUpdate} - 更新有效。为什么?

因为在这种情况下使用对象解构,您将对象解压缩为带有值的独立变量(名称,姓氏...)。在这种情况下{objForUpdate},传递的时间将成为{"name":"foo", "lastname":"bar", "type":"2"}正确的更新对象。


查看完整回答
反对 回复 2022-01-13
  • 1 回答
  • 0 关注
  • 223 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信