【问题标题】:How to update a document under a condition, using one query only如何在一个条件下更新文档,仅使用一个查询
【发布时间】:2018-06-22 17:34:10
【问题描述】:

假设我们有一个包含如下文档的集合:

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

我要做的是将字段“状态”更新为“完成”,仅 如果(总计 = 完成 + 错误)

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

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

我知道我可以通过两步提交查询(使用文档版本)来做到这一点。但我想知道是否有一个单一的查询解决方案。

谢谢。

【问题讨论】:

    标签: mongoose mongodb-query


    【解决方案1】:

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

    就我而言,我需要的查询是:

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

    【讨论】:

      猜你喜欢
      • 2019-02-21
      • 2018-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 2015-05-09
      相关资源
      最近更新 更多