2014-09-19 19 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運行批量操作。