MongoDB 由 10gen 團隊(現為 MongoDB Inc.)在 2009 年推出,是 Document Database 的一種,功能和關聯式資料庫相當接近,同時又具備高可擴展性的資料庫。MongoDB 透過 Sharding Key 進行資料分片,每個分片稱為 Chunk
;所有的資料也會有一或多份副本存放在 Replica Set,其中一個為 Primary,其餘的為 Secondaries,資料會先被寫入 Primary 後複製到 Secondaries,並保持最終一致性。MongoDB 使用的資料結構是 BSON (取義 Binary JSON),這讓開發者可以更加彈性的使用它,不需要預先定義完整 Schema 並強制所有資料共用,並可透過設定索引的方式提升查詢效能。
在 MongoDB 中,一筆資料是一個 Document
,多個 Document 被存放在 Collection
中,而一個 Database
中可以有多個 Collection。
由於 MongoDB「幾乎」具備關聯式資料庫的功能,像是可以使用複雜的查詢語法對資料進行查詢,和建立索引提升查詢效能,又同時擁有高可擴展性,可以透過加機器不斷水平擴展以滿足資料量的成長,成為主流的 NoSQL Database 之一,是許多開發者在挑選資料庫時的熱門選擇。
因為 MongoDB 的同筆資料會被存放在 Replica Set 多個副本中,如果是被寫進 Primary 和所有 Secondaries 之後才會回應寫入成功,效能會比較差,但可以確保資料遺失的機率較低;相反的,當只寫入 Primary 成功就回應寫入成功,可以提升寫入的效能,但當 Primary 在來不及同步到 Secondaries 前就出問題時,即便資料庫回應寫入成功,資料卻遺失了。讀取資料時,因為最終一致性表示有可能暫時存在資料不一致的狀況,如果選擇取不同副本都得到相同結果後才視為取得資料,效能也會比較差,但可確保取到的資料更即時更正確;若只要一或兩個副本擁有同樣的資料就回傳,則可有較快的回應速度,只是有機會取到過時不正確的資料。上述情境可以透過設定 read concern
和 write concern
的數值來調整,視系統的設計需求決定如何在資料可靠度和效能間取捨。