[英]Mongoose only update document value if its defined
我只想更新文檔中新定義的值。 如果未定義,請將該值保留在文檔中。 下面的例子。
如果該文件存在於數據庫中
{
"_id": "592c53b3bdf350ce004ad717",
"url": "hyoh7ryb-",
"fname": "Foo",
"lname": "Bar",
"email": "foobar@gmail.com",
"__v": 0,
"verfied": false,
"bio": {
"title": "Software Engineer",
"intro": "I like to code stuff.",
"summary": "Specializing in web development. Favorite language is Javascript.\n"
}
}
我的代碼:
module.exports.updateBio = function(req, res) {
var userID = req.params.id;
var objForUpdate = {bio: {}};
if (!app.isEmptyString(req.body.profile_picture)) objForUpdate.bio.profile_picture = req.body.profile_picture;
if (!app.isEmptyString(req.body.title)) objForUpdate.bio.title = req.body.title;
if (!app.isEmptyString(req.body.intro)) objForUpdate.bio.intro = req.body.intro;
if (!app.isEmptyString(req.body.summary)) objForUpdate.bio.summary = req.body.summary;
if (!app.isEmptyString(req.body.skills)) objForUpdate.bio.skills = req.body.skills;
if (!app.isEmptyString(req.body.facebook)) objForUpdate.bio.social.facebook = req.body.facebook;
if (!app.isEmptyString(req.body.twitter)) objForUpdate.bio.social.twitter = req.body.twitter;
if (!app.isEmptyString(req.body.linkedin)) objForUpdate.bio.social.linkedin = req.body.linkedin;
if (!app.isEmptyString(req.body.website)) objForUpdate.bio.social.website = req.body.website;
var conditions = { _id: userID }
, setObj = { $set: objForUpdate }
, options = { multi: true };
Profile.update(conditions, setObj, (error, page) =>{
if(error) return res.status(500).json({ success: false, error: error });
res.status(200).json({ success: true, message: "Bio successfully updated." });
});
};
在我的身體發送請求中,我僅更新標題,但我想保留所有其他生物信息,但相反,它將為他們創建一個空白字段。
我該如何處理呢?
嵌套對象(如bio)的設置語法為:
$ set:{'bio.profile_picture':20}
所以試試這個:
module.exports.updateBio = function(req, res) {
var userID = req.params.id;
var objForUpdate = {};
if (!troolr.isEmptyString(req.body.profile_picture)) objForUpdate['bio.profile_picture'] = req.body.profile_picture;
if (!troolr.isEmptyString(req.body.title)) objForUpdate['bio.title'] = req.body.title;
if (!troolr.isEmptyString(req.body.intro)) objForUpdate['bio.intro'] = req.body.intro;
if (!troolr.isEmptyString(req.body.summary)) objForUpdate['bio.summary'] = req.body.summary;
if (!troolr.isEmptyString(req.body.skills)) objForUpdate['bio.skills'] = req.body.skills;
if (!troolr.isEmptyString(req.body.facebook)) objForUpdate['bio.social.facebook'] = req.body.facebook;
if (!troolr.isEmptyString(req.body.twitter)) objForUpdate['bio.social.twitter'] = req.body.twitter;
if (!troolr.isEmptyString(req.body.linkedin)) objForUpdate['bio.social.linkedin'] = req.body.linkedin;
if (!troolr.isEmptyString(req.body.website)) objForUpdate['bio.social.website'] = req.body.website;
var conditions = { _id: userID }
, setObj = { $set: objForUpdate }
, options = { multi: true };
Profile.update(conditions, setObj, (error, page) =>{
if(error) return res.status(500).json({ success: false, error: error });
res.status(200).json({ success: true, message: "Bio successfully updated." });
});
};
您應該這樣修改$ set運算符:
$set: {
'bio.title' : 'someinfo'
}
當你說:
var objForUpdate = {bio: {}};
這基本上意味着,您將擦除生物對象內部的所有屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.