如何只更新MongoDB数据库中的对象的一些属性

我的代码下面不允许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); } 

首先,为了解决你的问题,只更新一些特定的属性,你必须使用$set操作符来设置一个特定的字段。 当您直接将findOneAndUpdate传递给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上,如果它已经存在,则将其全部replace。 修补程序意味着您仅更新资源的一些属性,并且replace整个事物。 这不会影响应用程序的function,但这是一个巨大的语义问题和terminal用户问题,因为他们期望PATCH。

使用$ set

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