如何在考虑到并发限制的情况下更新多行?

时间:2020-01-22 08:37:10

标签: mongodb concurrency

我有一个MongoDB数据库,可以用作排队系统。它跨多个服务器使用,每个服务器都运行代码的多个实例。

直到现在,我一直在使用find_one_and_delete使下一个项目待处理,但是最近我感到不幸的是,此功能占用大量资源,并且当集合达到10万个条目时,MongoDB的运行速度大大降低,并且需要几秒钟的时间。

我希望没有办法获得一个条目,而是希望通过确保没有并发冲突来检索该集合中的X个项目。

不幸的是,据我所知,update_many不包含limit


到目前为止,这是我想到的:

  1. 使用唯一ID(uuid)更新所有待处理项目
  2. 找到下一个具有该uuid的X项,将其保存在本地并将其删除在队列中
  3. 使用uuid将所有其他项目更新为“无”(释放它们)。

不好,但是在我看来,它已解决了该问题,并且看起来工作正常。

我要问的是,是否有一种方法可以更快(在update_many上使用limit)和MongoDB并发的方式?

2 个答案:

答案 0 :(得分:2)

值得尝试将Mongodb Transactions作为并发安全机制。

  • 通过交易创建会话
  • 检索X条记录,collection.find().limit(X)
  • 删除X条记录,collection.deleteMany({ _id: { $in: [IDs] } })
  • 提交交易并关闭会话

有关此处交易的更多信息

答案 1 :(得分:0)

好吧,如果您知道在系统中大多数时候需要哪些键,则可以创建一个会话,直接在deleteMany中传递查询并提交事务。

这将很快,因为您现在不必遍历文档来获取木乃伊或确定要删除的记录,Mongo会为您完成。

相关问题