原文位址:http://www.mongodb.org/display/DOCS/Introduction
MongoDB不是在實驗室中設計的,它來源于我們建構大規模、高實用性、健壯性系統的經驗中。我們不是從頭開始的,我們想要指出問題在哪裡并且扭轉局面。是以我考慮MongoDB的方法是,如果你使用MySql,并且想要從關系型資料庫轉到基于文檔的資料庫(MongoDB是基于文檔的資料庫——譯者注),你就獲得了大量優秀的特征:綁定文檔提升了速度,易管理性,通過無模式資料庫進行靈活開發,更容易的水準括展性(因為連接配接不再重要)。關系型資料庫有很多重要的東西:索引、動态查詢和更新,等等。但是我們不需要更改很多。例如,在MongoDB中設計索引的方法應該和在MySql和Oracle中完全一樣,你具有的是決定是否對綁定字段進行索引的權力。
– Eliot Horowitz,10創CTO和聯合創始人
Why MongoDB?
面向文檔
文檔(對象)能很好地映射程式設計語言資料類型
綁定文檔和數組降低了連接配接的需求
動态類型(無模式)便于模式演進
無連接配接和無多文檔事務提高了性能和擴充性
高性能
無連接配接和綁定使得讀寫更快了
索引包括了綁定文檔和數組的鍵的索引
可選的流寫入(無需确認)
高可用性
備份伺服器可以自動進行故障恢複
易擴充性
自動分片(通過伺服器對資料自動分區)
讀寫被跨片配置設定
無連接配接和多文檔事務使得分布式查詢更友善快捷
最終一緻的讀可以通過備份伺服器配置設定
富查詢語言
大規模部署
1. 一個或多個分片,每個分片承載全部資料的一個分區(自動管理)。讀和寫被自動發送到合适的分片,每個分片都由一個備份集支援(備份集隻承載該分片的資料)。
一個備份集就是一個或多個伺服器,每個都承載着相同資料的拷貝。在任何時間,其中一個是主要集而其他都是次要集。若主要集失效則其中一個次要集自動變為主要集。所有的寫入和一緻讀出都在主要集上,所有的最終一緻讀出都配置設定在次要集中。
2. 多個配置伺服器,每個都承載着中繼資料的一個拷貝,用以表明哪些資料在哪個分片上。
3. 一個或多個路由器,每個都為一個或多個用戶端充當一個伺服器。用戶端向路由器發送查詢更新請求,路由器在查詢配置伺服器後将它們路由給合适的分片。
4.一個或多個用戶端,每個都是使用者應用(的一部分),并且通過mongo用戶端庫(驅動)自己的語言向路由器發送指令。
圖中,mongod是伺服器程式(資料或配置)。Mongos是路由器程式。
小規模部署
1. 一個備份集(自動故障恢複),或者一個伺服器帶有0個或多個從屬機(不能自動故障恢複)
2. 一個或多個用戶端作為一個整體或單一管理者向備份集發送指令。
Mongol資料模型
<!--[if !supportLists]-->· 一個Mongo系統(參考上面的部署)承載多個資料庫(database)
<!--[if !supportLists]-->· 一個資料庫承載多個集合(collection)
<!--[if !supportLists]-->· 一個集合承載多個文檔document
<!--[if !supportLists]-->· 一個文檔就是多個字段field
<!--[if !supportLists]-->· 一個字段就是一個鍵值對key/value
<!--[if !supportLists]-->· 一個鍵是一個字元串名稱
<!--[if !supportLists]-->· 一個值是一個
<!--[if !supportLists]-->· 基本資料類型(string, integer, float, timestamp, binary, etc)
<!--[if !supportLists]-->· 文檔
<!--[if !supportLists]-->· 值的數組
Mongo查詢語言
想要從資料庫集合(collection)中取回某些資料,你要提供一個查詢到比對你想要的字段的文檔中。
例如,{name: {first: 'John', last: 'Doe'}}将比對集合中所有名字是John Doe的文檔。
類似地,{name.last: 'Doe'}将比對所有姓是Doe的文檔。
而且,{name.last: /^D/}會比對姓是以D開始的文檔(正則式比對)。
查詢也會比對内部綁定的數組。例如,{keywords: 'storage'}會比對關鍵字數組中有storage的文檔。
類似地,{keywords: {$in: ['storage', 'DBMS']}} 将比對關鍵字數組中有storage或者DBMS的文檔。
如果你的集合中有大量文檔,而你想要進行快速查詢,那就為查詢建構一個索引。
例如,ensureIndex({name.last: 1}) 或者ensureIndex({keywords: 1})。
注意,索引會占據空間并且降低更新效率,是以僅在值得折衷的時候使用吧。