【问题标题】:MongoDB - How to Ensure Multiple Updates were All Successfull ?MongoDB - 如何确保多次更新都成功?
【发布时间】: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,应该切换回关系数据库。

标签: mongodb mongoose mongodb-query nosql


【解决方案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 操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多