深入了解MangoDB的Shell和文檔
1.MongoDB shell
MangoDB其實是數據庫shell.一般假定它和mongod運行在同一臺機器上,還假定了mongod綁定了默認端口.
如果不是這樣的話,可以在啟動時指定這些參數,讓shell連接另一臺服務器:
- mongo 192.168.10.10:10000
這樣就會連接運行在192.168.10.10上端口為10000的mongod
shell默認連接test數據庫,要使用別的數據庫,在服務器地址后添加斜杠和數據庫名:
mongo 192.168.10.10:10000/refactor
這樣會連接192.168.10.10:10000上的refactor數據庫
也可以用--nodb選項啟動shell,而不連接任何數據庫,而只是試試javascript
mongo --nodb
db絕不是僅有的數據庫,從shell中可以連接任意多的數據庫,這對多個服務器的環境很方便.調用connect(),
并將結果賦值給變量.如在分片環境中,可能想用mongos表示mongos服務器,還想要有每個片的連接,可以
如下操作:
mongos=connect("127.0.0.1:10000")
shard0=connect("127.0.0.1:10001")
shard1=connect("127.0.0.1:10002")
這樣就能將mongos,shard0,shard1作為db變量使用.
shell工具
對于管理多個數據庫,有多個數據庫變量就比簡單的db有用處,如在分片中,
要維護一個單獨的只想配置服務器的變量:
config=db.getSisterDB("config")
config.shards.find()
2.BSON
MongoDB的文檔是個抽象概念,其具體的呈現形式取決與使用的驅動和編程語言.
因為MongoDB中的通信大量依賴于文檔,所以需要一種所有驅動,工具和進程都能共享的文檔表達方式.
這種表達方式叫Binary JSON(BSON)
BSON是輕量級的二進制格式,能將MongoDB的所有文檔表示為自己字符串.數據庫能理解BSON,存在磁盤上的文檔
也是這種格式.
當驅動要插入文檔,或者將文檔作為查詢條件,驅動會將文檔轉化成BSON,然后再發往服務器.同樣,返回到客戶端的文檔
也是BSON格式的字符串.驅動需要將這些數據解碼,編程本機的文檔表示,***返回給客戶端.
用BSON的三個主要原因:
a.效率
BSON設計用來更有效的表示數據,暫用更好的空間.最差的情況下,BSON比JSON效率略低,***的情況下(
比如存放二進制數據或著大多數),BSON要比JSON要高效的多.
b.可遍歷行
有些時候BSON犧牲了空間效率,換取更容易遍歷的格式.如,在字符串前面加入其長度,而不是在結尾處使用一個終結符
這對MongoDB的內嵌文檔很有用.
c.性能
BSON編碼和解碼速度都很快.它用C風格的表現方式表示類型,在大多數編程語言中都很快.
2.MongoDB的傳輸協議
驅動在TCP/IP協議的基礎上簡單封裝了MongoDB傳輸協議,用來與MongoDB交互.
MongoDB的傳輸協議基本上是對一個簡單封裝的BSON數據,如,插入消息會有20字節的頭部數據(包括
告知服務器執行寫入操作的代碼,以及消息長度,要插入的集合名,要插入的BSON文檔列表)
3.數據文件
MongoDB的數據目錄中,每個數據庫都有幾個獨立的文件.每個數據有一個.ns文件和若干數據文件,數據文件以
遞增的數字結尾,所以,數據庫refactor會被存放在refactor.ns,refactor.0,refactor.1等文件中.
每個新的以數字結尾的數據文件大小會加倍,直到達到***值2GB.這是為了讓小數據庫不浪費太多的磁盤空間,
同時讓大數據庫使用磁盤上連續的空間.
MongoDB為了保證性能還會預分配數據文件(可以用--norealloc關閉這一功能).預分配在后臺完成,有數據文件
被填滿時就會自動啟動.這意味著MongoDB服務器總是視圖在每一個數據庫保留一個額外的空數據文件來避免
文件分配產生的阻塞.
4.命名空間和數據域
在數據文件內部,每個數據庫都是按照 命名空間 組織的,一種類別的數據與其它類別的分開存放.每個集合的文檔都有
自己的命名空間,索引也是.命名空間的元數據存放在數據庫的.ns文件中.
每個命名空間的數據都被分成若干組,放到數據文件的某一個區域內,這個區域成為數據域.
如圖:
數據庫foo有3個數據文件,其中第3個是預分配的空文件.前兩個數據文件被分成幾個數據域,屬于幾個不同的命名空間

每個命名空間可以有幾個不同的數據域,在磁盤上不必連續.類似于數據庫的數據文件,每次新分配的命名空間
的數據域大小也會增加.這是為了平衡命名空間浪費的控件和盡量讓一個命名空間的數據連續做出的這種.
圖中還有個特殊的命名空間$freelist,存放這不再使用的數據域(如刪除集合或索引產生的數據域).
當命名空間分配新的數據域時,系統會先查找空閑列表,看看有沒有適合大小的數據域可用
5.內從映射存儲引擎
MongoDB默認的存儲引擎是內存映射引擎,當服務器啟動后,將所有數據文件映射到內存,然后由操作系統來
負責將緩沖數據寫入磁盤并將數據調入調出內存頁面
這樣的移情有若干重要的特性:
a)MongoDB管理內存的代碼非常精煉,原因是將大部分工作交給了操作系統.
b)MongoDB服務器進程的虛擬大小通常會非常大,超過整個數據集的大小,這沒關系,
因為操作系統會處理讓那些數據常駐內存.
c)MongoDB不能控制數據寫入到磁盤的順序,也就不能用預寫日志提供單機的持久性.
d)32位的MongoDB服務器有個限制,每個mongod最多處理2GB數據,這是因為所有數據必須能用32位地址訪問到.
原文鏈接:http://www.cnblogs.com/refactor/archive/2012/08/15/2602348.html
【編輯推薦】























