MongoDB入門

爲什麼要學習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作爲數據存儲的主要原因。
BSON官網地址:http://bsonspec.org/
使用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是可選的,引用的文檔所在的數據庫的名稱。

參考:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章