MongoDB是一種強大,靈活,可擴展的數據存儲方式.它擴展了關系型數據庫的眾多有用功能,如輔助索引,范圍查詢和排序.MongoDB的功能非常豐富,比如:內置的對MapReduce式聚合的支持,以及對地理空間索引的支持.
1.1豐富的數據模型
MongoDB是面向文檔的數據庫,不是關系型數據庫.放棄關系模型的主要原因就是為了獲得更加方便的擴展性,還有其他的好處.
基本思路就是將原來"行"(row)的觀念轉化為更加靈活的"文檔"(document)模型.面向文檔的方式可以將文檔或者數組內嵌進來,所以可以用一條記錄表示非常復雜的層次關系.
MongoDB沒有模式:文檔的鍵不會事先定義也不會固定不變.由於沒有模式需要更改,通常不需要遷移大量數據,不比將所有數據都放在一個模子裡面,應用層可以處理新增或者丟失的鍵
1.2容易擴展
應用數據集的大小增長很快.傳感器技術的發展,帶寬的增加,連接internet手持設備的普及使得當下即便是很小的應用也要存儲大量的數據,量大到數據庫處理困難.T級別的數據庫已司空見慣.
由於開發者要存儲的數據不斷增長,就會面臨選擇:是升級數據庫(買台更好的服務器),
還是擴展數據庫(將數據分散到很多的機器上).通常升級數據庫是最省力氣的做法,但價格不菲.
但是擴展不但經濟而且還能持續增加:想要增加存儲空間或者提升性能,只需要買台一般的服務器加入到集群中.
MongoDB最初的設計就考慮了擴展的問題,它所采用的面向文檔的數據模型使其可以自動在多台服務器間分割數據.它還可以平衡集群的數據和負載,自動重排文檔.這樣開發者就可以專注於編寫應用,而不是考慮如何擴展.要是需要更大的容量,只需在集群中添加新機器,然後讓數據庫來處理剩下的事.
1.3豐富的功能
a)索引
MongoDB支持通用輔助索引,能進行多種快速查詢,也提供唯一的,復合的和地理空間索引能力
b)存儲JavaScript
開發人員不必使用存儲過程,可以直接在服務端存取JavaScript函數,值
c)聚合
MongoDB支持MapReduce和其他聚合工具
d)固定集合
集合的大小是有上限的,這對某些類型的數據(如日志)特別有用
e)文件存儲
MongoDB支持用一種容易使用的協議存儲大型文件和文件的元數據
有些關系型數據庫的常見功能,MongoDB不具備,如:join和復雜的多行事務.
這個架構上考慮是為了提高擴展性,因為這兩個功能實在很難在一個分布式系統上實現.
1.4高性能
MongoDB使用MongoDB傳輸協議作為與服務器交互的主要方式(與之對應的協議需要更多的開銷,如:http/Rest).
它對文檔進行動態填充,預分配數據文件,用空間換取性能的穩定.默認的存儲引擎中使用了內存映射文件,將內存管理工作
交給操作系統去處理.動態查詢優化器會"記住"執行查詢最高效的方式.
雖然MongoDB功能強大,盡量保持關系型數據庫的眾多特性,它盡可能的將服務器處理邏輯交給客戶端(由驅動程序或者用戶的應用程序處理).這樣精簡的設計是的MongoDB獲得了非常好的性能.
1.5簡便的管理
MongoDB盡量讓服務器自治來簡化數據庫的管理,處理啟動數據庫服務器之外,幾乎沒有什麼必要的管理操作.如果主服務器掛掉了,MongoDB會自動切換到備份服務器上,並且將備份服務器升級為活躍服務器.在分布式環境下,集群只需要知道有新增的節點,就會自動集成和配置新節點.
MongoDB的管理理念就是盡可能的讓服務器自動配置,讓用戶在需要的時候調整設置.
MongoDB的願景是對自身更好的诠釋--建立一個靈活,高效,易於擴展,功能完備的數據庫