公司採用 MongoDB 做爲新項目的數據存儲方式,之前沒那麼大規模用過,內心仍是有點懸,不知道會掉在哪些坑裏,先給本身挖個坑。php
mongoDB 的第一個大坑:好大的坑,讓我忙了一個下午。。。mongodb對本身開發的nodejs驅動太不負責任了吧。。。node
問題描述:採用異步方式插入三條數據(三條數據的插入間隔時間不超過1s),當第一條數據寫入但尚未執行回調的時候就開始插入下一條數據就會出現索引異常,提示大意就是插入了兩條相同鍵值的記錄。mysql
爲何呢:以前在用 php 寫入數據的時候不會發生這個問題,大概是由於 php 是順序執行的,沒有異步的特徵。看了官方的文檔,mongodb 的 _id 生成機制是基於時間戳,當前進程ID以及當前計數器的值,因爲時間很短,當前時間戳是同樣的,當前的進程也是同樣的,問題發生的關鍵就是 mongodb nodejs 驅動在尚未執行回調的時候計數器的值不會增長(天啊,mongo是怎麼想的啊,mysql 很早就避免了這個問題,執行一次id就會遞增一次,並且無論這條信息是否執行成功,保證了是原子性的遞增方式,這樣才比較有業界良心啊),這樣就形成了nodejs幾乎同時寫入mongodb時會發生索引錯誤,就是11000錯誤代碼sql
方案:採用本身生成的 _id 來代替 mongo 生成的 _id 值,這樣就可以有效進行避免。mongodb