在MongoDB中选择更新跳过锁定

在MongoDB中选择更新跳过锁定,mongodb,Mongodb,我有100多个工作线程,它们将轮询数据库,寻找新的工作 要接受作业,线程需要将一组文档的状态从NEW更改为IN\u PROGRESS,这样其他线程就无法查看相同的作业 在PostgreSQL中,使用SELECT FOR UPDATE SKIP LOCKED WHERE status=“NEW”语句可以很好地解决这个问题 有没有办法在MongoDB中对单个文档进行原子更新?对于批处理?有一种方法,其工作原理与您对单个文档的描述完全相同 对于一批,现在是不可能的,因为 在MongoDB中,写入操作,

我有100多个工作线程,它们将轮询数据库,寻找新的工作

要接受作业,线程需要将一组文档的状态从
NEW
更改为
IN\u PROGRESS
,这样其他线程就无法查看相同的作业

在PostgreSQL中,使用
SELECT FOR UPDATE SKIP LOCKED WHERE status=“NEW”
语句可以很好地解决这个问题

有没有办法在MongoDB中对单个文档进行原子更新?对于批处理?

有一种方法,其工作原理与您对单个文档的描述完全相同

对于一批,现在是不可能的,因为

在MongoDB中,写入操作,例如
db.collection.update()
db.collection.findAndModify()
db.collection.remove()
在单个文档的级别上是原子的


但是,在MongoDB 4.0中,可以使用。

对单个文档执行此操作-是<代码>查找并修改。对于批处理-不确定,但我认为不是。了解事务和原子性:,尽管查询可能匹配多个文档,db.collection.findAndModify()将只选择一个文档进行修改。findAndModify如何确保没有其他线程同时更改同一条目?@kris:我相信是(并且应该是)实现细节。重要的是,它的原子性是有保证的。。我有一个电子邮件cron任务要测试。。最坏情况。有人收到两封电子邮件。如果在一个事务中运行
find和modify
,该
Update
对并发事务可见吗?