天天看點

(翻譯)零 MongoDB入門-MongoDB簡介

原文位址: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})。

注意,索引會占據空間并且降低更新效率,是以僅在值得折衷的時候使用吧。