[英]MongoDb NodeJS driver findOneAndUpdate not working atomically
我有一個函數,應該從mongo數據庫中按“ ID”查找問題並將其返回,如果找不到,它將創建一個問題,然后將其返回。 它是我代碼中唯一能夠在數據庫中創建新問題實體的功能。 它在這里:(順便說一句,我正在使用官方的MongoDb驅動程序用於nodeJs)
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”字段的問題實體,但這正是發生。
我的代碼有什么問題嗎? 我的假設錯了嗎?
不要設置文檔的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,因為它僅在插入時才起作用,並且在文檔已經存在時也不會更新鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.