爲什麼要學習MongoDB?
傳統的SQL方式操作數據庫過於複雜、要考慮的問題太多、容易出錯
MongoDB的Bson方式操作數據庫學習簡易,容易上手
只要設計合理,MongoDB效率可以遠超MySql
完全開源免費
各種編程語言完全兼容
什麼是MongoDB?
MongoDB是一個基於分佈式文件存儲的開源數據庫系統。
在高負載的情況下(需要更多的存儲空間和更強的處理能力),添加更多的節點(這就是所謂的分片),可以保證服務器性能。
MongoDB是面向集合存儲的文檔型數據庫,其涉及到的基本概念與關係型數據庫相比有所不同。
MongoDB | 關係型數據庫 |
|
DataBase | DataBase | 數據庫 |
Collection | Table | 數據庫表/集合 |
Document/BSON Document | Record/Row | 數據庫記錄行/文檔 |
field | Column | 數據字段/域 |
Index | Index | 索引 |
| table joins | 表連接,MongoDB不支持 |
MonggoDB文檔
文檔是MongoDB最核心的概念,本質上時一種類JSON的BSON格式的數據。
BSON是一種類JSON的二進制格式數據,它可以理解爲在JSON基礎上添加了一些新的數據類型,包括日期、int32、int64等。
BSON是由一組組鍵值對組成,它具有輕量性、可遍歷性和高效性三個特徵。可遍歷性是MongoDB將BSON作爲數據存儲的主要原因。
使用MongoDB文檔時需要注意以下問題:
①MongoDB中寫操作的原子性限制在文檔級別,對文檔的保存、修改、刪除等都是原子操作
②單個文檔佔用的存儲空間不能超過16MB
③MongoDB會盡量保持文檔被插入時鍵值對的順序(update時會改變鍵值對的順序)
④鍵值對是有序的
{"type":1,"status":2}不等於{"status":2,"type":1}
文檔的大小寫信息是敏感的
文檔中不能出現重複的鍵
文檔的值不僅可以是字符串,還可以是其他幾種類型,甚至可以是整個嵌入的文檔
以下是MongoDB中常用的幾種數據類型
數據類型 |
|
String |
|
Integer |
|
Boolean |
|
Double |
|
Min/Max keys | 將一個值與BSON元素的最低值和最高值相對比 |
Array | 用於將數組或列表或多個值存儲爲一個鍵 |
Timestamp | 時間戳。記錄文檔修改或添加的具體時間 |
Object ID |
|
Null | 用於創建空值 |
Symbol | 符號。該數據類型基本等同於字符串類型,但不同的是,它一般採用特殊符號類型的語言 |
Date | 日期時間。用UNIX時間格式來存儲當前日期或時間 |
Object | 用於內嵌文檔 |
Binary Data | 二進制數據 |
Code | 代碼類型。用於在文檔中存儲JavaScript代碼 |
Regular expression | 正則表達式類型 |
關於文檔鍵的命名需要注意以下幾點:
①_id事故系統保留的關鍵字,它是默認的主鍵,該值在集合中必須唯一,且不可更改。
②鍵名不能包含\0或空字符,這個字符用於表示鍵的結尾
③不能以$開頭
④不能包含.(點號)
MongoDB集合
集合就是一組文檔,類似於關係數據庫中的表。
集合是無模式的,集合中的文檔可以是各式各樣的。它們的鍵值可以不同,值的類型也可以不同,但是它們可以存放在同一個集合中,也就是不同模式的文檔都可以放在同一個集合中。
但是如果把各種模式的文檔放在同一個集合中,對於開發者來說無疑是災難的,集合難以管理,對集合的查詢、索引等操作效率都不高,在獲取到查詢結果後還需過濾掉各種不同類型的文檔。
所以在實際的使用中,往往將文檔分類放在不同的集合中。
這種對文檔進行劃分來分別存儲的模式並不是MongoDB的強制要求,用戶可以靈活選擇。
可以使用“.”按照命名空間將集合劃分爲子集合。雖然子集合沒有任何特殊的地方,但是使用子集合組織數據結構更清晰。
關於集合的命名需要注意以下幾點:
①不能使空字符串
②不能含有\0字符或空字符,這個字符用於表示集合的結尾
③不能以"system."開頭,這是爲系統集合保留的前綴
④用戶創建的集合名字不能含有保留字符。有些驅動程序的確支持在集合名裏面包含,這是因爲某些系統和生成的集合中包含該字符。除非你要訪問這種系統穿件的集合,否則千萬不要在名字裏出現$
元數據
數據庫的信息是存儲在集合中的。它們使用了系統的命名空間:
dbname.system.*
在MongoDB數據庫中名字空間<dbname>.system.*是包含多種系統信息的特殊集合(Collection)
集合命名空間 | 描述 |
---|
dbname.system.namespaces | 列出所有名字空間。 |
dbname.system.indexes | 列出所有索引。 |
dbname.system.profile | 包含數據庫概要(profile)信息。 |
dbname.system.users | 列出所有可訪問數據庫的用戶。 |
dbname.local.sources | 包含複製對端(slave)的服務器信息和狀態。 |
MongoDB數據庫
MongoDB中多個文檔組成集合,多個集合組成數據庫。
一個MongoDB實例可以承載多個數據庫。它們之間可以看做相互獨立,每個數據庫都有獨立的權限控制。在磁盤上,不同的數據庫存放在不同的文件中。
MongoDB中存在以下系統數據庫:
①Admin:權限數據庫,如果創建用戶的時候將該用戶添加到admin數據庫中,那麼該用戶就自動繼承了所有數據庫的權限。
②Local:這個數據庫永遠不會被複制,可以用來存儲本地單臺服務器的任意集合。
③Config:當MongoDB使用分片模式時,config數據庫在內部使用,用於保存分片的信息
MongoDB文檔的嵌入和引用
對於關係型數據庫,不同類型的信息需存入不同的表中。查詢某些關聯的信息時,需要檢索多個表。
但是對於mongoDB或者其他非關係型數據庫來說,可以將關聯的信息嵌入在單一的文檔中。
每個MongoDB文檔都由BSON文檔組成,有類似JSON格式一樣的數據類型,其中String、Int、Float稱爲基本類型(或常量),而Hash和Array稱之爲複合類型。
所謂的嵌套,就是說文檔中,利用複合類型,包裹一個多或多個其他類型的值,這些值稱之爲子文檔。
文檔嵌套的數量和深度沒有限制,但MongoDB目前版本限制一個文檔最大爲16MB。
採用這種方法維持了數據邏輯上的完整性,可以將一整項數據作爲一個整體來操縱。對比在關係型的數據庫中,爲了設計出符合規範的表,我們常常要將多個數據項才分爲幾個表,然後通過外鍵來獲取數據。這樣做的後果是,當我們只看一個單獨的表的數據時,通常只能看到一部分數據,而其他的都是外鍵id,影響了可讀性和邏輯的完整性。
檢索時,只需要數據從一個文檔加載到內存中,不必加載多個文檔,提高了檢索效率。
mongodb是介於關係型與非關係型數據庫之間的,mongodb的join查詢可以通過引用來實現。
mongodb的引用是通過額外的執行一次查詢來解決的。
mongodb提供了兩種方式來實現:手動引用和使用DBRef標準
①手動引用
手動引用就是在文檔中插入要引用文檔的id,檢索時,通過_id進行一次額外的檢索就可以獲取所需的信息了
②DBRef
DBRef提供了一個更正式的規範引用文檔之間的數據
在DBRef中,數據庫引用以標準的JSON/ BSON嵌入對象存儲的。
語法:
{ $ref : <collectionname>, $id : <id value>[, $db : <database name>] }
<collectionname>代表引用的集合的名稱。
<id value>所引用的文檔的_id值。
$ db是可選的,引用的文檔所在的數據庫的名稱。
參考: