MongoDB - 如何确保多次更新都成功?
Posted
技术标签:
【中文标题】MongoDB - 如何确保多次更新都成功?【英文标题】:MongoDB - How to Ensure Multiple Updates were All Successfull ? 【发布时间】:2014-11-14 12:03:54 【问题描述】:假设您有一个应用,其中用户的一个单个操作涉及从不同集合更新多个文档。
我实际上有 两个 问题 ;-)
最好的方法是什么?如何确保正确保存所有内容或取消操作?
我正在使用Mongoose
解决方案A - 嵌套回调
假设 userId 和 eventId 都是由客户端 POST 调用或通过套接字提供的
User.findById(userId,,function(err,myUser)
if(err)
console.log('Error updating user...');
return;
else
Event.findById(eventId,,function(err,myEvent)
if(err)
console.log('Error updating user's Event...');
return;
else
console.log('Both user and event were successfully updated');
socket.emit('Update success!') || res.send(...);
);
);
解决方案B - 并行调用
User.findById(userId,,function(err,myUser)
if(err)
console.log('Error updating user...');
return;
else
console.log('Success updating user');
socket.emit('..') || res.send('...');
);
Event.findById(eventId,,function(err,myEvent)
if(err)
console.log('Error updating user's Event...');
return;
else
console.log('Success updating Event');
socket.emit('Update success!') or res.send(...);
);
假设从一开始就知道 userId 和 eventId,解决方案 B 似乎明显更快。无论如何,在这两种情况下,只有在所有写操作都成功的情况下,如何确保对数据库执行 WRITE 操作?
我必须这样做是否意味着我的架构设计得不好,我应该合并信息?
感谢您的回复
【问题讨论】:
这表明你真的想要 ACID,应该切换回关系数据库。 【参考方案1】:您可以使用 BulkOperations 并执行以下操作:
var bulk = db.items.initializeUnorderedBulkOp();
bulk.find( status: "D" ).update( $set: status: "I", points: "0" );
bulk.find( item: null ).update( $set: item: "TBD" );
bulk.execute();
参考:http://docs.mongodb.org/manual/reference/method/Bulk.find.update/
bulk.execute();将返回一个 BulkWriteResult,其中包含批量操作的结果,在这种情况下,是 nModified 文档:http://docs.mongodb.org/manual/reference/method/BulkWriteResult/#BulkWriteResult
但是,我认为自 MongoDb 2.6 发布以来,无法从 mongoose 运行 Bulk 操作。
【讨论】:
以上是关于MongoDB - 如何确保多次更新都成功?的主要内容,如果未能解决你的问题,请参考以下文章
带有 mgo 的 Go (golang) 中的 MongoDB:如何更新记录、确定更新是不是成功并在单个原子操作中获取数据?