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:如何更新记录、确定更新是不是成功并在单个原子操作中获取数据?

更新两个数据库时如何保证事务管理

我们如何确保 mongoDb 中的数据完整性?

mongodb数据库都有哪些优势

Redux saga:我如何确保只有我的 saga 能够更新某个状态?

如何使用 Java 中的 ObjectID 更新 MongoDB 中的文档