Mongoose中的原子多操作

时间:2014-12-02 20:16:47

标签: node.js mongoose atomicity

考虑一个架构:

var userSchema = mongoose.Schema({
...
followers: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
following: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }]
...
}

userA跟随userB后,userB将被推入userA.following,而userA将被推入userB.followers。这两个操作都需要.save()

确保如果.save()中的任何一个失败,两个文件都保持不变,有什么好方法 - 也许是概念性的?

2 个答案:

答案 0 :(得分:4)

我在第一条评论中提到@BatScream。我重新组织了我的数据模式并删除了列表followers

在阅读了很多关于这个主题的内容之后,我的简单结论是,在mongoDB / Mongoose.js中跨多个文档进行交易虽然可行,但可能并不是最聪明最安全的事情。实现两阶段提交时,回滚操作本身可能会失败。

如果需要跨多个文档的原子操作,可能MongoDB不是正确的工具。但是,一些数据重组/重组可能有时会使多文档事务变得不必要。

答案 1 :(得分:0)

使用Mongoose的交易API https://mongoosejs.com/docs/transactions.html。这样,您就可以隔离执行多个查询,如果其中任何一个失败,则可以撤消所有查询