[英]MongoDB multiple collection update
我有一个方案,其中API调用需要更新两个单独的集合。 如果一个更新失败,则需要还原到第一个更新。 如何确保两个操作都成功完成或什么都不完成。 为了澄清,这是情况。 在快速框架中使用MongoJS。
问题模型
{
_id: ObjectId(),
title: String,
description: String,
accepted: String,
// Some other fields
}
答案模型
{
_id: ObjectId(),
qid: String, //ObjectId of question its linked to
body: String,
accepted: boolean,
// Some other fields
}
方法1:首先拉出与请求中发送的id
对应的答案。 将其标记为已接受并获得qid
。 在与qid
对应的问题文档中插入answer id
。 如果第二项操作失败,请还原为第一项操作。 但是,如果数据库连接丢失,则无法执行。
方法2首先得到与qid
对应的问题。 使用answer id
更新accepted
字段,然后获取与之对应的答案并将其标记为接受。
否则,如果一个答案被接受,我们需要将所有其他答案设为未接受。 这是第三次手术。 此外,它是一个切换操作,因此,如果它已经被接受,我们需要做相反的事情。
我觉得有一种更干净,更安全的方式来处理这种情况。
MongoDB 没有进行多文档事务的方法 。 因此,没有像这样进行回滚的干净方法。 它必须在应用程序中实现。 MongoDB文档建议使用两阶段提交模式来制作类似事务的语义。 您可以使用此方法来实现回滚,但这可能非常麻烦。
一种替代方法是重新考虑您的文档架构。 您可以将answer
文件嵌入question
文件中吗? 使用嵌入式文档将更好地利用Mongo的功能,而不是尝试实现事务。 MongoDB对单个文档具有原子写入功能,因此,如果更新嵌入式文档时出错,则可以回滚整个操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.