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

我有两个集合,一个 (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 中删除该项目。

https://stackoverflow.com/questions/5942575/

相关文章:

php - 如何单击表条目并在另一个 mongodb 集合(php/jquery)中搜索它

mongodb - Azure:不支持 DocumentDB Mongo $group

spring - 使用 Spring 数据 MongoDB @Document 创建一个上限集合

mongodb - 如何在复杂的 Collection-Object 中附加新文档

mongodb - 在mongo聚合中将ObjectID转换为字符串

javascript - 使用 Nodejs 在 mongodb 中存储文件

mongodb - 如何在 $lookup Mongodb 的 LocalField 中将字符串转换

mongodb - 可以在 MongoDB 查询中使用严格的 JSON $dates 吗?

regex - Mongo 正则表达式搜索的索引范围

mongodb - 为什么直接搜索 MongoDB 分片的全文搜索比通过集群管理器 (mongos)