假设我们有一个包含这样文档的集合:
{
status: 'running',
progress: {
total: 50,
completed: 40,
error: 10
}
}
我想要做的是更新字段" status"到"完成",只有 if(total = completed + error)。
我有很多线程更新已完成和错误字段,如果进度完成,他们必须更新状态。
但我想只在一个查询中执行此操作,而不是进行2次查询。如果我使用2个查询来执行此操作,则可能会出现同步问题(一个线程会读取文档,第二个线程会在第一个更新之前更新它...因此某些信息会丢失)。
我知道我可以通过两步提交查询(使用文档版本)来完成此操作。但我想知道是否有一个单查询解决方案。
感谢。
答案 0 :(得分:0)
我一直在阅读mongodb文档,发现他们在v3.6中添加了$ expr运算符,该运算符可以进行此查询。
对于我来说,我需要的查询是:
db.pruebas.findOneAndUpdate( { $and: [ {"status": "running"}, { $expr: { $eq: [ "$progress.total", { $add: ["$progress.completed", "$progress.error"] } ] } } ] }, {$set:{"status": "done"}})