假设给定用户
的当前数据是
{
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 应该是完整的用户记录。
有没有办法更新所有已更改的字段,但只需更新即可保留以前未触及的字段?
我知道解决方法是使用以下代码,但(也许是一厢情愿)我更愿意在更新功能链之外验证数据并将数据分配给我的用户记录。
必须对数据库进行两次调用,一次是为了查找,另一次是为了更新,这感觉有点过分了
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
。请引用下面的查询,它已经过测试并且可以正常工作,根据要求进行修改
db.agreements.update({},{ $set:
{
"accountType":45,
"address.address1":"india",
"shareDealing.providers.uk.accountProviderId":984,
}
})
关于javascript - 如何使用 Mongoose 更新嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51304772/