【发布时间】:2018-12-20 15:12:25
【问题描述】:
假设给定User 上的当前数据是
{
accountType:12,
address:{
address1:"uk1"
},
shareDealing:{
providers:{
uk:{
accountProviderId:"12",
accountProviderName: "as",
}
}
}
}
然后我想插入以下数据以更改所有字段,但我不包括 shareDealing.providers.uk.accountProviderName,因为它没有更改,我希望该数据保留在用户文档中
所以我要更新的数据是
user = {
accountType:22,
address:{
address1:"aaaaaa"
},
shareDealing:{
providers:{
uk:{
accountProviderId:"333333333333",
}
}
}
};
所以我运行了以下代码
User.update(searchBy, user, {upsert:true}).then((data) =>{
if(data === null) throw new AppError(400,"User Not Found",5);
res.json({ message: 'User Updated', data: req.body });
logger.debug("Saved Data : Using "+ JSON.stringify(searchBy) +" record: "+ JSON.stringify (data));
}).catch( (error) => {
new Errorhandler( new AppError(400,error)).display(req,res);
});
我的问题
当我进行更新时,更新后的用户记录没有accountProviderName: "as",因为它认为最新的 JSON 应该是完整的用户记录。
有没有办法更新所有更改的字段,但只更新保留以前未触及的字段?
我知道一种解决方法是使用以下代码,但(可能是一厢情愿)我更愿意在我的更新函数链之外验证数据并将数据分配给我的用户记录。
不得不对数据库进行 2 次调用,一个来查找另一个来更新,感觉有点矫枉过正
User.findById(searchBy).then((fetchedUser) => {
if(fetchedUser === null) throw new AppError(400,"User Not Found",5);
// In my ideal world i would prefer to validate and assign data outside this chain
return functionThatValidatesAndAssignsDataToTheUser(fetchedUser,user);
}).then((model) => {
return model.save();
}).then((updatedModel) => {
res.json({
msg: 'model updated',
updatedModel
});
}).catch((err) => {
res.send(err);
});
【问题讨论】:
-
如果您想保留其他字段,请使用
$set,例如User.update(searchBy, {$set: user}, {upsert:true}),这将保留您所有剩余的字段 -
@ArifKhan 不起作用仍在从文档中删除更新语句中未设置的字段
标签: javascript node.js mongodb mongoose nosql