如何仅使用一个查询更新条件下的文档

时间:2018-06-18 09:41:43

标签: mongoose mongodb-query

假设我们有一个包含这样文档的集合:

{
    status: 'running',
    progress: {
        total: 50,
        completed: 40,
        error: 10
    }
}

我想要做的是更新字段" status"到"完成",只有 if(total = completed + error)

我有很多线程更新已完成和错误字段,如果进度完成,他们必须更新状态。

但我想只在一个查询中执行此操作,而不是进行2次查询。如果我使用2个查询来执行此操作,则可能会出现同步问题(一个线程会读取文档,第二个线程会在第一个更新之前更新它...因此某些信息会丢失)。

我知道我可以通过两步提交查询(使用文档版本)来完成此操作。但我想知道是否有一个单查询解决方案。

感谢。

1 个答案:

答案 0 :(得分:0)

我一直在阅读mongodb文档,发现他们在v3.6中添加了$ expr运算符,该运算符可以进行此查询。

对于我来说,我需要的查询是:

db.pruebas.findOneAndUpdate( { $and: [ {"status": "running"}, { $expr: { $eq: [ "$progress.total", { $add: ["$progress.completed", "$progress.error"] } ] } } ] }, {$set:{"status": "done"}})