我有两个集合,一个 (A) 包含要处理的项目(相对较小),另一个 (B) 包含已处理的项目(相当大,有额外的结果字段)。
从 A 读取项目,处理并保存()到 B,然后从 A 删除()。
基本原理是这些索引可以不同,并且“传入”集合可以通过这种方式保持非常小和快速。
我遇到了两个问题:
我可以使用 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 中将字符串转换