如果新值不为空,则更新集合字段

我只会更新一个集合设置值,只有当新的值不为空。 我有这样的代码:

... var userName = req.body.nome; var userSurname = req.body.cognome; var userAddress = req.body.indirizzo; collection.update( {_id:ObjectId(req.session.userID)}, {$set: { nome: userName, cognome: userSurname, indirizzo: userAddress }} ) 

有这样一个简单的方法吗?

另外一种方式:如果我可以从占位符的数据中取出req.body.*的值,我可以解决这个问题。但是这可能吗?

你可以尝试这样的事情:

 var objForUpdate = {}; if (req.body.nome) objForUpdate.nome = req.body.nome; if (req.body.cognome) objForUpdate.cognome = req.body.cognome; if (req.body.indirizzo) objForUpdate.indirizzo = req.body.indirizzo; var setObj = { $set: objForUpdate } collection.update({_id:ObjectId(req.session.userID)}, setObj}) 

你可以通过将req.body到你的模型来使用mongoose,

我假设你有mongoose模型称为User ,并在你的控制器,

 var userModel = new User(req.body); User.update({_id: req.session.userID}, userModel, {upsert: true}, function(err){ console.log("Error occured!"); }); 

没有mongoose标签,但我强烈推荐使用它。 更多细节;

mongoose更新

mongoose模型

你不只是要求通过你发布的所有领域? 那么为什么不这样做呢?

(基本上只是你的代码的剪切和粘贴):

 collection.update( {_id: ObjectId(req.session.userID)}, {$set: req.body } ) 

然后,无论您发布为字段的内容是否在您的更新中设置。

请注意,使用set 只会覆盖或添加新的字段。 如果你只是想replace整个文档,那么删除整个{$set: (..) }表示法,只是传入req体,因为它是一个valild对象。

HüseyinBABAL的答案是正确的,但是这会从mongo中产生一个警告,因为调用new User()会创build一个不可变的新_id 。 你想要做的是以下几点:

 const userModel = Object.assign(req.body); User.update({_id: req.session.userID}, userModel, {upsert: true}, function(err){ console.log("Error occured!"); });