如果新值不为空,则更新集合字段
我只会更新一个集合设置值,只有当新的值不为空。 我有这样的代码:
... 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!"); });