繁体   English   中英

MongoDB多个集合更新

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM