我有一个简单的$ inc,它也有{upsert: true}
。意味着应该创建它(如果不存在)。
我每天有超过一百万个这样的电话。通常正常。但是我不时看到有两个使用相同参数创建的文档。意味着并发存在问题。
有什么我可以做的并发吗?
根据以下stackoverflow答案,它应该是并发的。 How does the $inc modifier work with concurrent requests in mongodb?
问题在于它不是我的。
答案 0 :(得分:1)
尽管$inc
是原子的,但是当需要插入文档时,upsert不是原子的。
因此,您需要做的是向您的集合添加一个唯一索引,该索引涵盖您要向上插入的字段,然后处理重复键异常以从意外重复中恢复。
this other answer on the topic中的一个示例:
var minute = utils.minute();
Monitor.update({ _id: minute }, { $inc: update }, { upsert: true }, function(err) {
if (err) {
if (err.code === 11000) {
// Another upsert occurred during the upsert, try again. You could omit the
// upsert option here if you don't ever delete docs while this is running.
Monitor.update({ _id: minute }, { $inc: update }, { upsert: true },
function(err) {
if (err) {
console.trace(err);
}
});
}
else {
console.trace(err);
}
}
});