这似乎是一个普通的数据库问题,但我会在我目前的NodeJs + MongoDb上下文中提出这个问题。
假设我们有一个ID为“xyz”的通用计数器。这是获取最新计数并将其增加1的代码:
collection.find({id: "xyz"},
function(err, currentCount) {
collection.update({id: "xyz"},
{$inc: {count: 1}},
function(err, data) {
cb(currentCount);
}
}
}
问题是,如果两个客户端同时尝试调用此代码,则两个客户端可能会获得相同的计数,然后集合会更新计数两次 - 这是不可取的!如何解决这个问题?
答案 0 :(得分:3)
$ inc是原子的,没有风险。它保留了不起作用的外部发现。
collection.update({id: "xyz"},
{$inc: {count: 1}},
function(err, data) {
cb(data);
}
}
很可能是你想要的。
答案 1 :(得分:0)
您可以使用findAndModify,它会修改对象并返回更新后的版本。这可以保证每个调用者的值都会增加。
collection.findAndModify( {id: 'xyz' }, ['_id'], {$inc: {count: 1}},
function (err, data) {
cb(data);
});