2014-09-19 62 views
1

假设你有一个应用程序,其中来自用户的一个操作涉及从不同集合更新多个文件。MongoDB - 如何确保多个更新都是成功的?

其实我有问题;-)

是什么做的最好的办法,以及如何确保要么一切都正确保存或取消操作?

im使用Mongoose

- 嵌套回调

假设两个用户id和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操作?

是否我必须这样做的事实意味着我的模式设计得不好,我应该合并信息?

感谢您的答复

+0

它向我建议你真的想要ACID并且应该切换回关系数据库。 – duffymo 2014-09-19 20:11:05

回答

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运行批量操作。