仅当新值不为null时,我才会更新设置值的集合。 我有这样的代码:
...
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.*
,我可以解决问题..但这可能吗?
答案 0 :(得分:13)
您可以尝试这样的事情:
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;
//before edit- There is no need for creating a new variable
//var setObj = { $set: objForUpdate }
objForUpdate = { $set: objForUpdate }
collection.update({_id:ObjectId(req.session.userID)}, objForUpdate })
答案 1 :(得分:1)
您可以通过将req.body
投射到模型
我假设你有一个名为User
的猫鼬模型,并且在你的控制器中,
var userModel = new User(req.body);
User.update({_id: req.session.userID}, userModel, {upsert: true}, function(err){
console.log("Error occured!");
});
没有猫鼬标签,但我强烈建议使用它。有关详细信息;
答案 2 :(得分:1)
您是否只是要求传递您发布的所有字段?为什么不这样做呢?
(基本上只是代码的剪切和粘贴):
collection.update(
{_id: ObjectId(req.session.userID)},
{$set: req.body }
)
然后,在您的更新中设置您作为字段发布的任何内容。
请注意,使用set只会 覆盖,或添加新字段。如果您只想替换整个文档,则删除整个{$set: (..) }
表示法,然后传入req正文,因为它是一个valild对象。
答案 3 :(得分:0)
Hüseyin BABAL的回答是正确的,但是会从mongo生成警告,因为调用new User()
会创建一个不可变的新_id
。你想要做的是以下几点:
const userModel = Object.assign(req.body);
User.update({_id: req.session.userID}, userModel, {upsert: true},
function(err){
console.log("Error occured!");
});
答案 4 :(得分:0)
您可以像其他问题一样使用lodash:https://stackoverflow.com/a/33432857/4777292
_.pickBy({ a: null, b: 1, c: undefined }, _.identity);
将会
{b:1}
答案 5 :(得分:0)
如果没有您不希望用户更改的任何字段。因为此方法将采用任何不为空的值并对其进行更新。您可以这样做。
const updatedFields = {};
Object.keys(req.body).forEach(key => {
if (!isEmpty(req.body[key])) {
updatedFields[key] = req.body[key];
}
});
YourModel.findOneAndUpdate(
{ employee_id: req.body.employee_id },
{$set:updatedFields},
{new:true}).then(updatedObj =>{
console.log("updated obj:",updatedObj);
})
是空函数
const isEmpty = value =>
value === undefined ||
value === null ||
(typeof value === "object" && Object.keys(value).length === 0) ||
(typeof value === "string" && value.trim().length === 0);
答案 6 :(得分:0)
此版本仍允许尊重和更新空字符串字段。忽略的字段将被忽略。
const cleanedObject = Object.keys(origObject).reduce((acc, k) => {
if (typeof origObject[k] === "undefined") return acc;
acc[k] = origObject[k];
return acc;
}, {});
collection.update({_id:ObjectId(req.session.userID)}, cleanedObject })
答案 7 :(得分:0)
可能您已经通过了用户身份验证,因此您应该具有req.user。*
在这种情况下,您可以使用三元运算符来分配值,并使用新值或当前值对其进行更新(因此没有更新)
var userName = req.body.nome ? req.body.nome : req.user.nome;
var userSurname = req.body.cognome ? req.body.nome : req.user.cognome;
var userAddress = req.body.indirizzo ? req.body.indirizzo : req.user.indirizzo;
collection.update(
{_id:ObjectID(req.session.userID)},
{$set: { nome: userName, cognome: userSurname, indirizzo: userAddress }}
)
如果没有req.user,则可以分3个步骤进行操作。 1.在集合中查找用户 2.获取当前数据 3.使用新的或当前的(如上所述)更新数据
let currentName
let currentSurname
db. collection.findOne({_id: ObjectID(req.session.userID)}, (err, user) => {
if (err) { } // handle error here
else if (user) {
currentName = user.name
currentSurname = user.surname
}
})