原文地址: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]-->· 基礎資料型別 (Elementary Data Type)(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})。
注意,索引會佔據空間並且降低更新效率,所以僅在值得折衷的時候使用吧。