gpt4 book ai didi

mongodb - 在集合之间移动文档是表示 MongoDB 中状态变化的好方法吗?

转载 作者:IT老高 更新时间:2023-10-28 13:08:42 24 4
gpt4 key购买 nike

我有两个集合,一个 (A) 包含要处理的项目(相对较小),另一个 (B) 包含已处理的项目(相当大,有额外的结果字段)。

A 读取项目,处理并保存()到 B,然后从 A 删除()。

基本原理是这些索引可以不同,并且“传入”集合可以通过这种方式保持非常小和快速。

我遇到了两个问题:

  • 如果 remove() 或 save() 超时或在加载时失败,我会完全丢失该项目,或处理两次
  • 如果两者都失败,则会发生副作用,但没有记录

我可以使用 findAndModify 锁来回避双重失败的情况(否则不需要,我们有一个进程级别的锁),但是我们有过时的锁问题,部分失败仍然可能发生。据我所知,没有办法自动删除+保存到不同的集合(也许是设计使然?)

是否有针对这种情况的最佳实践?

最佳答案

There's no way to atomically remove+save to different collections, as far as I can tell (maybe by design?)

是的,这是设计使然。 MongoDB 明确不提供连接或事务。删除+保存是一种交易形式。

Is there a Best Practice for this situation?

这里确实有两个低复杂度的选项,都涉及 findAndModify

选项 #1:单个集合

根据您的描述,您基本上是在构建一个具有一些额外功能的队列。如果您利用单个集合,那么您可以使用 findAndModify 在每个项目正在处理时更新它的状态。

不幸的是,这意味着您将失去这个:...“传入”集合可以通过这种方式保持非常小和快速

选项 #2:两个集合

另一个选项基本上是两阶段提交,利用 findAndModify

查看此 here 的文档.

一旦在A 中处理了一个项目,您就可以设置一个字段来将其标记为删除。然后将该项目复制到 B。复制到 B 后,您可以从 A 中删除该项目。

关于mongodb - 在集合之间移动文档是表示 MongoDB 中状态变化的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5942575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com