我有两个定义如下的模型:
var OrganizationSchema = new mongoose.Schema({
users: [mongoose.Schema.Types.ObjectId]
});
和
var UserSchema = new mongoose.Schema({
organizations: [mongoose.Schema.types.ObjectId]
});
当用户想要加入组织时,我需要更新组织集合和用户集合。我想知道实现这个目标的最佳方法是什么?当一个更新请求失败时,是否值得考虑这种情况?我目前正在做这样的事情(组织是模型组织的集合实例):
User.findByIdAndUpdate(req.userSession.userId, { $push: { organizations: organization.id } }, function (err){
if (err)
{
// server error
console.log(err);
}
else
{
organization.users.push(req.userSession.userId);
organization.save(function (err){
if (err)
{
// server error we need to cancel
User.findByIdAndUpdate(req.userSession.userId, { $pull: { organizations: organization.id } }, function (err){
if (err)
{
// we got a problem one collection updated and not the other one !!
console.log(err);
}
});
}
else
{
// success
}
});
}
});
问题是:如果我的第二次更新方法失败,我最终会更新一个集合而不是另一个集合?有没有办法确保它们都更新?
答案 0 :(得分:0)
首先,我会清楚这个设计。我会在组织中引用或嵌入用户,而不是同时嵌入用户,所以我不会遇到这样的问题(每次复制数据都会发生这种情况)。
MongoDB不支持同步更新或事务。因此,您需要在代码中对此进行管理。
所以是的,如果第二次更新失败,那么当您编写代码时,您必须回滚,如果回滚失败,则必须重试直到成功(尽管可能具有指数退避)。请记住,可能会与其他请求相关(另一个用户尝试同时保存相同的内容)。要处理这个问题,你必须为数组中的每个条目赋予唯一性。