Mongodb 如何在考虑并发性的情况下使用限制更新多行?

Mongodb 如何在考虑并发性的情况下使用限制更新多行?,mongodb,concurrency,Mongodb,Concurrency,我有一个MongoDB数据库,用作排队系统。它跨多个服务器使用accross,每个服务器运行多个代码实例 到目前为止,我一直在使用find_one_和_delete来获取下一个待处理的项目,但我最近遇到了一个不幸,即此功能非常占用资源,当收集量达到10万个条目时,MongoDB的速度会减慢很多,并且需要几秒钟才能响应 我不想尝试获取一个条目,而是想通过确保不存在并发冲突来检索该集合上的X项 不幸的是,据我所知,许多更新不包括限制 到目前为止,我想到的是: 使用唯一ID(uuid)更新所有待定项

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

到目前为止,我一直在使用
find_one_和_delete
来获取下一个待处理的项目,但我最近遇到了一个不幸,即此功能非常占用资源,当收集量达到10万个条目时,MongoDB的速度会减慢很多,并且需要几秒钟才能响应

我不想尝试获取一个条目,而是想通过确保不存在并发冲突来检索该集合上的X项

不幸的是,据我所知,许多更新不包括
限制


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

  • 使用唯一ID(uuid)更新所有待定项
  • 查找下一个具有该uuid的X项,将它们保存在本地并在队列中删除它们
  • 将uuid设置为“无”的所有其他项更新(释放它们)
  • 它不是很好,但在我的情况下,它解决了这个问题,看起来工作正常


    我在这里要问的是,是否有一种方法可以更快地(在更新时使用
    limit
    )和面向并发的方式来实现这一点?

    值得尝试将MongoDB事务作为并发安全机制

    • 使用事务创建会话
    • 检索X条记录,
      collection.find().limit(X)
    • 删除X条记录,
      collection.deleteMany({u id:{$in:[id]}})
    • 提交事务并关闭会话
    更多交易信息请点击此处


    如果您知道在系统中查询大多数时间需要哪些键,那么您可以创建一个会话,直接在deletemanny中传递查询并提交事务


    这将很快,因为现在您不必迭代文档来获取Mongoid或确定要删除的记录,Mongo将为您完成这些操作。

    另一个方向-使用多个数据库。为此,请使用经过良好调优的专用Maria Db实例?用过。只要开发和运营团队是开放的,并且可以使用一些自动化和工具来完成他们的工作,这样就可以轻松处理2倍的数据库。我已经实现了你想要的。你感兴趣吗?谢谢,我已经给了你赏金。哇,这是我第一次赏金:)谢谢,希望答案对你有帮助:)谢谢!需要考虑的一个关键点是,这仅在MongoDB位于sharded或replicat集合上时有效!否则,事务就不起作用了:有趣的是,它们似乎有这样的限制。谢谢你指出这一点