Javascript 同时更新2个不同的集合
我有两个这样定义的模型:Javascript 同时更新2个不同的集合,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我有两个这样定义的模型: var OrganizationSchema = new mongoose.Schema({ users: [mongoose.Schema.Types.ObjectId] }); 及 当用户想要加入组织时,我需要同时更新组织集合和用户集合。我想知道实现这一目标的最佳方式是什么?当一个更新请求失败时,是否值得考虑这种情况?我目前正在做类似的事情(其中organization是模型组织的集合实例): 问题是:如果我的第二个更新方法失败,我最终会更新一个集合而不是
var OrganizationSchema = new mongoose.Schema({
users: [mongoose.Schema.Types.ObjectId]
});
及
当用户想要加入组织时,我需要同时更新组织集合和用户集合。我想知道实现这一目标的最佳方式是什么?当一个更新请求失败时,是否值得考虑这种情况?我目前正在做类似的事情(其中organization是模型组织的集合实例):
问题是:如果我的第二个更新方法失败,我最终会更新一个集合而不是另一个?有没有办法确保它们都已更新 首先,我会避开这个设计。我会在组织中引用或嵌入用户,反之亦然,而不是同时引用或嵌入两个用户,这样我就不会有这样的问题(每次复制数据时都会发生这种情况) MongoDB不支持同步更新或事务。因此,您需要在代码中管理这一点
因此,是的,如果第二次更新失败,那么在编写代码时必须回滚,如果回滚失败,则必须重试,直到成功(尽管可能是指数级回滚)。请记住,这可能会与其他请求发生冲突(另一个用户试图同时保存相同的内容)。要处理这个问题,您必须为数组中的每个条目指定一个唯一项。我有几乎相同的问题。。希望我们能得到答案。
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
}
});
}
});