猿问

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

我已经有了另一个解决方案,但不明白为什么我的不起作用。


我尝试在这里使用 $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 });

        }

    }


慕田峪9158850
浏览 224回答 1
1回答

ITMISS

如果你要调试代码,你会得到它。假设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"}正确的更新对象。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答