MongoDB - 如何确保多个更新都成功?

时间:2014-09-19 20:04:15

标签: mongodb mongoose mongodb-query nosql

假设您有一个应用,其中来自用户的一个单个操作涉及从不同集合中更新多个文档。

我实际上有两个问题; - )

执行此操作的最佳方式是什么,以及如何确保正确保存所有内容或取消操作?

我正在使用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操作?

我必须这样做的事实意味着我的架构设计不合理,我应该合并信息吗?

感谢您的回复

1 个答案:

答案 0 :(得分: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运行批量操作。