MongoDB是一款強大、靈活、且易於擴展的通用型數據庫python
MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。mysql
在高負載的狀況下,添加更多的節點,能夠保證服務器性能。sql
MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。數據庫
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。數組
光說的話,仍是有點兒模糊,就讓咱們來作一個小例子,進行一個對比吧緩存
下面咱們作一張表:mysql的服務器
這是咱們用關係型數據庫作的一張很簡單的User表對吧session
接下來咱們再看一下MongoDB的數據結構:數據結構
這......這不就是個列表,裏面放着三個字典嗎?你說的對,若是你理解成了列表和字典,那麼證實了你只會Python,在其餘語言中它又是別的類型了,咱們把這種類型的玩意兒,叫作:Json架構
那麼你就該恍然大悟了吧,MongoDB的每一個表(Collection)中存儲的每條數據(Documents)都是一個一個的Json,Json中的每個字段(Key)咱們稱之爲:Field
就此咱們引出了三個關鍵字,Collection也就是關係型數據庫中"表"的概念,Documents就是"數據條目",Field就是"字段"
1. 易用性
MongoDB是由C++編寫的,是一個基於分佈式文件存儲的開源數據庫系統,它不是關係型數據庫。在高負載的狀況下,添加更多的節點,能夠保證服務器的性能。
MongoDB是一個面向文檔(document-oriented)的數據庫,而不是關係型數據庫。
不採用關係型主要是爲了得到更好得擴展性。固然還有一些其餘好處,與關係數據庫相比,面向文檔的數據庫再也不有「行「(row)
的概念取而代之的是更爲靈活的「文檔」(document)模型。經過在文檔中嵌入文檔和數組,面向文檔的方法可以僅使用一條記錄
來表現複雜的層級關係,這與現代的面嚮對象語言的開發者對數據的見解一致。
另外,再也不有預約義模式(predefined schema):文檔的鍵(key)和值(value)再也不是固定的類型和大小
。因爲沒有固定的模式,根據須要添加或刪除字段變得更容易了。一般因爲開發者可以進行快速迭代,因此開發進程得以加快。
並且,實驗更容易進行。開發者能嘗試大量的數據模型,從中選一個最好的。
2. 易擴展性
應用程序數據集的大小正在以難以想象的速度增加。隨着可用帶寬的增加和存儲器價格的降低,即便是一個小規模的應用程序,須要存儲的數據量也可能大的驚人,甚至超出 了不少數據庫的處理能力。過去很是罕見的T級數據,如今已是司空見慣了。 因爲須要存儲的數據量不斷增加,開發者面臨一個問題:應該如何擴展數據庫,分爲縱向擴展和橫向擴展,縱向擴展是最省力的作法,但缺點是大型機通常都很是貴,並且 當數據量達到機器的物理極限時,花再多的錢也買不到更強的機器了,此時選擇橫向擴展更爲合適,但橫向擴展帶來的另一個問題就是須要管理的機器太多。 MongoDB的設計採用橫向擴展。面向文檔的數據模型使它能很容易地在多臺服務器之間進行數據分割。MongoDB可以自動處理跨集羣的數據和負載,自動從新分配文檔,
以及將用戶的請求路由到正確的機器上。這樣,開發者可以集中精力編寫應用程序,而不須要考慮如何擴展的問題。
若是一個集羣須要更大的容量,只須要向集羣添加新服務器,MongoDB就會自動將現有的數據向新服務器傳送
3. 豐富的功能
MongoDB做爲一款通用型數據庫,除了可以建立、讀取、更新和刪除數據以外,還提供了一系列不斷擴展的獨特功能 #一、索引 支持通用二級索引,容許多種快速查詢,且提供惟一索引、複合索引、地理空間索引、全文索引 #二、聚合 支持聚合管道,用戶能經過簡單的片斷建立複雜的集合,並經過數據庫自動優化 #三、特殊的集合類型 支持存在時間有限的集合,適用於那些將在某個時刻過時的數據,如會話session。相似地,MongoDB也支持固定大小的集合 ,用於保存近期數據,如日誌 #四、文件存儲 支持一種很是易用的協議,用於存儲大文件和文件元數據。MongoDB並不具有一些在關係型數據庫中很廣泛的功能, 如連接join和複雜的多行事務。省略 這些的功能是處於架構上的考慮,或者說爲了獲得更好的擴展性,由於在分佈式系統中這兩個功能難以高效地實現
4. 卓越的性能
MongoDB的一個主要目標是提供卓越的性能,這很大程度上決定了MongoDB的設計。MongoDB把儘量多的內存用做緩存cache,
視圖爲每次查詢自動選擇正確的索引。
總之各方面的設計都旨在保持它的高性能
雖然MongoDB很是強大並試圖保留關係型數據庫的不少特性,但它並不追求具有關係型數據庫的全部功能。
只要有可能,數據庫服務器就會將處理邏輯交給客戶端
。這種精簡方式的設計是MongoDB可以實現如此高性能的緣由之一
1. 文檔是MongoDB的核心概念.
文檔就是鍵值對的一個有序集合{"msg":"hello","foo":3}.相似於python中的有序字典
須要注意的是: #一、文檔中的鍵/值對是有序的。 #二、文檔中的值不只能夠是在雙引號裏面的字符串,還能夠是其餘幾種數據類型(甚至能夠是整個嵌入的文檔)。 #三、MongoDB區分類型和大小寫。 #四、MongoDB的文檔不能有重複的鍵。 #五、文檔中的值能夠是多種不一樣的數據類型,也能夠是一個完整的內嵌文檔。文檔的鍵是字符串。除了少數例外狀況,鍵可使用任意UTF-8字符。 文檔鍵命名規範: #一、鍵不能含有\0 (空字符)。這個字符用來表示鍵的結尾。 #二、.和$有特別的意義,只有在特定環境下才能使用。 #三、如下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。
二、集合就是一組文檔。
若是將MongoDB中的一個文檔比喻爲關係型數據的一行,那麼一個集合就是至關於一張表
#一、集合存在於數據庫中,一般狀況下爲了方便管理,不一樣格式和類型的數據應該插入到不一樣的集合,但其實集合沒有固定的結構, 這意味着咱們徹底能夠把不一樣格式和類型的數據通通插入一個集合中。 #二、組織子集合的方式就是使用「.」,分隔不一樣命名空間的子集合。 好比一個具備博客功能的應用可能包含兩個集合,分別是blog.posts和blog.authors,這是爲了使組織結構更清晰, 這裏的blog集合(這個集合甚至不須要存在)跟它的兩個子集合沒有任何關係。 在MongoDB中,使用子集合來組織數據很是高效,值得推薦 #三、當第一個文檔插入時,集合就會被建立。合法的集合名: 集合名不能是空字符串""。 集合名不能含有\0字符(空字符),這個字符表示集合名的結尾。 集合名不能以"system."開頭,這是爲系統集合保留的前綴。 用戶建立的集合名字不能含有保留字符。有些驅動程序的確支持在集合名裏面包含,這是由於某些系統生成的集合中包含該字符。 除非你要訪問這種系統建立的集合,不然千萬不要在名字裏出現$。
3. 數據庫:在MongoDB中,多個文檔組成集合,多個集合能夠組成數據庫
數據庫也經過名字來標識。數據庫名能夠是知足如下條件的任意UTF-8字符串: #一、不能是空字符串("")。 #二、不得含有' '(空格)、.、$、/、\和\0 (空字符)。 #三、應所有小寫。 #四、最多64字節。 有一些數據庫名是保留的,能夠直接訪問這些有特殊做用的數據庫。 #一、admin: 從身份認證的角度講,這是「root」數據庫,若是將一個用戶添加到admin數據庫,這個用戶將自動得到全部數據庫的權限。再者,一些特定的服務器端命令也只能從admin數據庫運行,如列出全部數據庫或關閉服務器 #二、local: 這個數據庫永遠都不能夠複製,且一臺服務器上的全部本地集合均可以存儲在這個數據庫中 #三、config: MongoDB用於分片設置時,分片信息會存儲在config數據庫
注意 : 把數據庫名添加到集合名前,獲得集合的徹底限定名,即命名空間
例如:
若是要使用cms數據庫中的blog.posts集合,這個集合的命名空間就是
cms.blog.posts。命名空間的長度不得超過121個字節,且在實際使用中應該小於100個字節