易于使用
MongoDB是一個面向文檔(document-oriented)的資料庫,而不是關系型資料庫;
MongoDB裡的“文檔”(document)對應關系性資料庫裡的“行”(row);
通過在文檔裡嵌入文檔和數組,面向文檔的方法能夠僅使用一條記錄來表現複雜的層次關系;
不再有預定模式:文檔的鍵(key)和值(value)不再是固定的大小和類型。
易于拓展
縱向拓展就是使用計算能力更強的機器,而橫向拓展就是通過分區将資料分散到更多的機器上。通常,縱向拓展是最省力的做法,其缺點是大型機器一般都非常昂貴,而且當資料量達到機器的實體極限時,無論花再多錢也買不到更強的機器了。而橫向拓展需要增加存儲空間或者提高性能,隻需要購買一台普通的伺服器并把它添加到叢集中就可以了,看起來橫向既便宜友容易拓展,不過管理100台機器可顯然比管理一台機器要困難得多。
MongoDB的設計采用橫向拓展。面向文檔的資料模型使它很容易能夠在多台伺服器之間進行資料分割。MongoDB能夠自動處理跨叢集的資料和負載自動重新配置設定文檔,以及将用請求路由到正确的機器上。如果有一個叢集需要更大的容量,隻需要向叢集中添加新伺服器,MongoDB就會自動将現有的資料向新伺服器傳送。
豐富的功能
索引(indexing):支援通用二級索引,允許多種快速查詢,而且提供唯一索引,符合索引,地理空間索引以及全文索引;
聚合(aggregation):“聚合管道”,使用者能夠通過簡單的片段建立複雜的聚合,并通過資料庫自動優化;
特殊的聚合類型:存在時間有限的集合,适用于那些在某些時刻過期的的資料,也支援固定大小的集合,用于儲存近期的資料;
檔案存儲(file storage):支援非常易用的協定,用于存儲的大檔案和檔案中繼資料。
卓越的性能
MongoDB能夠對文檔進行動态填充,也能預配置設定的資料檔案以利用額外的空間來換取穩定的性能。MongoDB把盡可能多的記憶體用作緩存,試圖為每次查詢自動選擇正确的索引。
基礎知識
文檔是MongoDB中資料的基本單元,類似與關系性資料庫中的“行”
集合(collection)可以看作是一個擁有動态模式的表
MongoDB的一個執行個體可以擁有多個互相獨立的資料庫,每個資料庫都擁有屬于自己的集合
每個文檔都有一個特殊的鍵“_id”,這個建在文檔所屬的集合中是唯一的
MongoDB自帶了一個簡單但是功能強大的Javascript shell,可用于管理MongoDB的執行個體或者資料庫
- 文檔
文檔就是鍵值對的一個有序集。每種程式設計語言表示文檔的方法不太一樣,但大多數程式設計語言都有一些相同的資料結構,比如映射(map),散列(hash)或字典(dictionary)。
文檔的鍵是字元串。除了少數情況以外,鍵可以使用UTF-8字元
鍵不能使用含\0(空字元)。這個字元用于表示鍵的結尾
.和$由特殊含義,隻能在特定的環境中使用。通常這兩個字元是被保留的
MongoDB不去分類型,但是區分大小寫
文檔中不能存在重複的鍵
- 集合
集合就是一組文檔。相當于關系型資料庫中的一張“表”。
動态模式
集合是動态模式的。者意味着一個集合裡面的文檔可以是各種各樣的。
将文檔按類型區分放在不同的集合的原因:
友善管理
查詢特定文檔時分開查詢速度更快
同類型的文檔放在一個集合中,資料會更加集中
可以更加更加有效的建立索引
命名
集合使用名稱辨別。集合名可以是符合一下标準的任意UTF-8字元串:
不能是空字元串
不能包含\0字元,這個字元表示集合名結束
不能以“system.”開頭,這是系統集合保留的字首
不能包含保留字元 ‘$‘
子集合
組織集合使用一種慣例是“.”分隔不同的z命名空間的子集合。
GridFS(一種用于存儲大檔案的協定)使用子集合來存儲檔案的中繼資料,這樣就可以與檔案内容塊很好的隔離開來
大多數驅動程式都提供了一些文法糖,用于通路制定集合的子集合。
- 資料庫
多個文檔組成集合,多個集合組成資料庫。
資料庫名規範:
字母數字下劃線
區分大小寫,簡單起見最好全部小寫
最多為64位元組
資料庫最終會變成檔案系統中的檔案,而資料庫名就是相應的檔案名。
系統保留資料庫:
admin:這是“root”資料庫。将使用者添加到這個資料庫,這個使用者将獲得所有的權限,另外一些特定的伺服器端指令隻能從admin資料庫運作;
local:這個資料庫永遠都不可以複制,且一台伺服器上的所有本地集合都可以存儲在這個資料庫中;
config:用于分片時設定,分片資訊存儲在這個資料庫中。
啟動MongoDB
啟動:
mongod
預設資料目錄:/data/db
端口:27017
mongod還會啟動一個非常基本的HTTP伺服器,通路
http://localhost:28017能擷取資料庫的管理資訊
MongoDB shell簡介
MongoDB自帶一個Javascript shell,可以在shell中使用指令行與MongoDb進行互動。
運作shell
mongo
此shell是一個功能完備的Javascript解釋器,可以運作任意Javascript程式。
-
MongoDB用戶端
上面啟動的這個shell不僅能運作JS程式,而且它是一個獨立的MongoDB用戶端,啟動時shell會連接配接到MongoDB伺服器的test資料庫,并将資料庫連接配接指派給全局變量db,這個變量是通過shell通路MongoDb的主要入口點。
檢視db目前指向哪一個資料庫:
db
test
為了友善習慣使用SQL shell的使用者,shell還包含一些非Javascript文法的拓展。這些拓展并不提供額外的功能,二是一些非常棒的文法糖。如:
選則資料庫:
use acmshow
switched to db acmshow
acmshow
shell基本操作
建立:insert
查詢:find和findOne,find會自動顯示最多20個比對的文檔
更新:update,接受兩個參數:限定條件和新的文檔
删除:remove,接受一個限定參數
- 資料類型
基本資料類型
在概念上MongoDB文檔和Javascript中的對象相近,因而可以認為它類似于JSON。JSON隻有6種資料類型:null,布爾,數字,字元串,數組和對象。然而JSON沒有日期類型, 也無法區分浮點數和正整數,更别說區分32位和64位了,再者JSON也無法表示一些通用類型如正規表達式。
MongoDB在保留了JSON的鍵值對特性的基礎上,添加了其他一些資料類型:
null
布爾
數值:預設使用64位浮點型值NumberInt(4位元組帶符号整數)或者NumberLong(8字元帶符号整數)
字元串:所有UTF-8字元串
日期
正規表達式
數組
内嵌文檔
對象ID
二進制資料
代碼
Date類可以用作MongoDB的日期類型。shell根據本地時區設定顯示日期對象,然而資料庫中存儲的日期僅為新紀元以來的毫秒數,并未存儲對應時區。
數組是一組值,它既能作為有序對象(如清單,棧或隊列),也能作為無序對象(如資料集)來操作。正常的鍵/值對支援所有值都可以作為數組的值,數組中甚至可以嵌套數組。
文旦可以作為鍵的值,這樣的文檔就是内嵌文檔。使用内嵌文檔,可以使資料組織方式更加自然,不用非得存成扁平結構的鍵值對。
_id和ObjectId
ObjectId是"_id"的預設類型。它設計成輕量型的,不同的機器都能用全局唯一的同種方法友善的生成它。這是MongoDB采用ObjectId,而不是其他比較正常的做法(比如說自動增加主鍵的原因),因為在多個伺服器上同步自動增加主鍵值費時又費力/。因為設計MongoDB的初衷就是用作分布式資料庫,是以能夠在分片環境中生成唯一的辨別符非常的重要。
使用MongoDB shell
$ mongo some-host:30000/myDB
MongoDB shell version: 2.4.0
connecting to: some-host:30000/myDB
db現在就指向了some-host:30000 上的 myDB 資料庫。
幫助:help
執行腳本如 $ mongo test.js 然後mongo會依次執行傳入的腳本,然後退出
也可以從互動式shell中執行腳本 > load("script1.js")
在腳本中可以通路db變量以及其他的全局變量
如果某些腳本需要頻繁加載,可以将他們添加到mongorc.js檔案中,這個檔案會在啟動shell時自動運作。