就我而言,$ inc修饰符不是并发的mongodb吗?有什么我可以做的并发吗?

时间:2018-10-21 15:07:13

标签: mongodb

我有一个简单的$ inc,它也有{upsert: true}。意味着应该创建它(如果不存在)。

我每天有超过一百万个这样的电话。通常正常。但是我不时看到有两个使用相同参数创建的文档。意味着并发存在问题。

有什么我可以做的并发吗?

根据以下stackoverflow答案,它应该是并发的。 How does the $inc modifier work with concurrent requests in mongodb?

问题在于它不是我的。

1 个答案:

答案 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);
        }
    }
});