Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongoose 如何在条件下仅使用一个查询更新文档_Mongoose_Mongodb Query - Fatal编程技术网

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

Mongoose 如何在条件下仅使用一个查询更新文档,mongoose,mongodb-query,Mongoose,Mongodb Query,假设我们有一个包含以下文档的集合: { status: 'running', progress: { total: 50, completed: 40, error: 10 } } 我试图做的是将字段“status”更新为“done”,只有在(total=completed+error)的情况下 我有很多线程在更新completed和error字段,如果进度也完成了,它们必须更新状态 但我只想在一个查询中完成,而不是进行两

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

{
    status: 'running',
    progress: {
        total: 50,
        completed: 40,
        error: 10
    }
}
我试图做的是将字段“status”更新为“done”,只有在(total=completed+error)的情况下

我有很多线程在更新completed和error字段,如果进度也完成了,它们必须更新状态

但我只想在一个查询中完成,而不是进行两个查询。如果我使用两个查询,我可能会有同步问题(一个线程读取文档,第二个线程在第一个线程更新之前更新它…因此一些信息丢失)

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


谢谢。

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

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

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