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"}})