如何在并发方面进行条件创建?

时间:2013-12-23 21:47:08

标签: mongodb mongoose

我最近解决了我的程序中导致重复收集条目的问题。它的要点:我们的代码库有一个“CreateDocument”方法,用于检查对象的存在,如果没有返回,则创建一个新文档。 (CV是一种猫鼬模型)

 CV.findOne(searchObj).exec().then(function (found)
                {
                    if (found)
                    {
                       //~do processing~
                    }
                    //did not find the value, so create
                    else
                    {
                        var newCV = new CV({
                            foo: "foo",
                            bar: "bar"
                        });
                        newCV.save();
                    }

此代码第一次运行时,错误地调用了两次事件,因此,我们的所有结果都是重复的。后续运行(甚至在双被调用事件被修复之前)没有创建其他文档。

我可以想到,这个重复发生的原因是在第一次save()调用成功之前发生了两个findOne()调用。

一般来说,如何在不担心遇到问题的情况下进行这种条件创作?

1 个答案:

答案 0 :(得分:1)

虽然您需要稍微重新构建代码,但我建议您使用findByIdAndUpdatereference)或findOneAndUpdatereference)。使用upsert选项应该有所帮助:

upsert: bool - creates the object if it doesn't exist. defaults to false

这样,您不会得到重复项,并且修改/更新将在数据库服务器上以原子方式发生。这可能意味着您需要指定其他条件来验证文档未被意外修改,但这取决于您的架构。