MongoDB及Mongoose的記錄

MongoDB是一種NoSQL的文檔型數據庫,其存儲的文檔類型都是JSON對象。node

在node.js中因爲代碼都是異步執行,且nosql也沒有「事物」這必定義,因此平常使用中很難保證數據庫操做的原子性。就是說,假設客戶端連續兩次發起同一事件將數據存入數據庫,極可能會致使數據被「重複」保存(但實際上,MongoDB的「默認」不會建立重複數據,由於其「惟一鍵」_id是不會重複的)。通常的立馬能想到的方法是在操做前進行檢驗,可是增長了多餘的IO操做不說,對於批量數據庫操做的時候力有不逮,且在高併發的狀況下,仍然會有數據重複的風險,由於在異步執行中,咱們沒法保證哪一個線程先執行哪一個線程後執行。一個比較好的方法是給除去_id外的其餘字段加上惟一索引。加上惟一索引後,就保證了這些字段不會重複,他會在插入重複錯誤的時候扔出一個錯誤。sql

因此在mongoose中可使用insertMany來執行批量插入,而後經過設置{ ordered:false }在吞掉錯誤,在mongoose的官方文檔裏,ordered爲true意味着會在遇到第一個錯誤時會馬上拋出失敗終止操做,爲false時將在執行過程當中忽略錯誤,待到全部操做完成以後再拋出錯誤,能夠在錯誤中再查找哪些是由於重複而形成的錯誤。數據庫

怎麼說呢,orm既有它的好處也有壞處,對於編碼,維護,防止注入等方面的好處明顯,可是對於性能,內存的消耗,以及連表查詢等複雜條件時的複雜有時也讓人頭疼。儘可能分清楚場合,如寫操做遠多於讀操做的時候。可是對於實際開發狀況來講,除開關鍵部位,其他地方仍是能用orm就儘可能用,由於不少時候,性能不是最重要的,代碼易於維護纔是。併發

相關文章
相關標籤/搜索