考虑一个架构:
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()
中的任何一个失败,两个文件都保持不变,有什么好方法 - 也许是概念性的?
答案 0 :(得分:4)
我在第一条评论中提到@BatScream。我重新组织了我的数据模式并删除了列表followers
。
在阅读了很多关于这个主题的内容之后,我的简单结论是,在mongoDB / Mongoose.js中跨多个文档进行交易虽然可行,但可能并不是最聪明最安全的事情。实现两阶段提交时,回滚操作本身可能会失败。
如果需要跨多个文档的原子操作,可能MongoDB不是正确的工具。但是,一些数据重组/重组可能有时会使多文档事务变得不必要。
答案 1 :(得分:0)
使用Mongoose的交易API https://mongoosejs.com/docs/transactions.html。这样,您就可以隔离执行多个查询,如果其中任何一个失败,则可以撤消所有查询