MongoDb NodeJS驱动程序findOneAndUpdate无法原子工作

时间:2017-04-09 13:44:43

标签: node.js mongodb

我有一个函数应该通过mongo数据库中的“ID”找到一个问题并返回它,如果找不到它创建一个然后返回它。它是我的代码中唯一能够在数据库中创建新问题实体的函数。这里是: (顺便说一句,我正在使用nodeJs的官方MongoDb驱动程序)

function getQuestionEntity(questionID, cb){
    const questions = db.collection('questions')

    questions.findOneAndUpdate(
        {ID: questionID},
        {$setOnInsert: 
            {
                ID: questionID,
                rating: 1.5,
                options: 4,
                answeredRight: 0,
                answeredWrong: 0

            }
        },
        {
            returnOriginal: false,
            upsert: true
        },
        (err, r)=>{
            if(err){throw new Error(err)}
            cb(r.value)
        }
    )
}

我已经读过findOneAndUpdate是一个原子操作,这意味着即使我将这个函数异步地循环到时间的末尾,我仍然不会在数据库中得到两个具有相同“ID”字段的问题实体,但是正是发生了什么。

我的代码有什么问题吗?我的假设错了吗?

1 个答案:

答案 0 :(得分:0)

不要将文档的id设置两次,然后你会以这样的结尾:

 questions.findOneAndUpdate(
   {ID: questionID},
   {$set: {rating: 1.5, options: 4, answeredRight: 0, answeredWrong: 0}}, 
   {upsert: true},
    (err, r)=>{
        if(err){throw new Error(err)}
        cb(r.value)
    }
   )

我没有在nodejs中测试过这段代码;不要使用$ setOnInsert,因为它仅在插入时有效,并且在文档已存在时不会更新密钥。