我有一个简单的$inc也{upsert: true}
.这意味着如果它不存在,它应该创建它。
我每天接到超过一百万个这样的电话。它通常工作正常。但是我不时看到有两个文档使用相同的参数创建。这意味着并发性存在问题。
我可以做些什么来使其并发吗?
根据下面的堆栈溢出答案,它应该是并发的。 $inc修饰符如何处理 mongodb 中的并发请求?
问题是它不是我做的。
虽然$inc
是原子的,但当需要插入文档时,更新插入不是原子的。
因此,您需要做的是向集合添加一个唯一索引,该索引涵盖要更新插入的字段,然后处理重复键异常以从意外重复中恢复。
关于该主题的另一个答案中的一个例子:
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);
}
}
});