我有一个函数应该通过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”字段的问题实体,但是正是发生了什么。
我的代码有什么问题吗?我的假设错了吗?
答案 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,因为它仅在插入时有效,并且在文档已存在时不会更新密钥。