2016-11-04 68 views
3

我正嘗試使用唯一的電子郵件創建新帳戶。其中一個選項是檢查是否存在具有相同電子郵件的帳戶。如果沒有,請創建新帳戶。插入項目原子性

Account 
    .find({email: req.body.email}) 
    .exec((err, accounts) => { 
     //Try to find an account that have the same email 
     if (!accounts.length) { 
      //If none is found create a new account with this email 
      var account = new Account({email: req.body.email}); 
      account.save(); 
     } 
    }); 

這種方法的問題是,我不清楚這是否是原子安全的。如果多個用戶同時嘗試使用同一封電子郵件創建新帳戶,該怎麼辦?這會毀了我的數據庫的一致性嗎?


我聽說過 獨特選項 SchemaType
我應該選擇那個選項嗎?
正在使用貓鼬內置驗證一個必須?其他選項?
上面的代碼被認爲是不好的做法?

回答

3

這在MongoDB中不會是原子級安全的。但是,您可以在電子郵件字段中使用唯一的索引。這會導致插入失敗,如果它已被使用或者如果有人剛插入它併發。

如果您打算使用分片,這可能會成爲一個問題,因爲只有分片鍵支持唯一索引。

+0

我該如何處理唯一索引錯誤?他們的簽名是什麼?也許我指向一些文檔? – rocketspacer

+2

錯誤的類型可能取決於您的數據庫驅動程序。我認爲貓鼬不會包裝錯誤,所以你會得到一個'MongoError:E11000重複鍵錯誤索引'。這可能有所幫助:https://github.com/Automattic/mongoose/issues/1225 – Erik