本文地址: http://www.cnblogs.com/egger/archive/2013/04/27/3047191.html 歡迎轉載 ,請保留此鏈接๑•́ ₃•̀๑!
數據類型
基本數據類型
MongoDB的文件存儲格式為BSON,同JSON一樣支持往其它文檔對象和數組中再插入文檔對象和數組,同時擴展了JSON的數據類型.與數據庫打交道的那些應用。例如,JSON沒有日期類型,這會使得處理本來簡單的日期問題變得非常繁瑣。只有一種數字類型,沒法區分浮點數和整數,更不能區分32位和64位數字。也沒有辦法表示其他常用類型,如正則表達式或函數。
下面是MongoDB的支持的數據類型:
- null null用於表示空值或者不存在的字段。 {"x":null}
- 布爾 布爾類型有兩個值'true'和'false1'. {"X":true}
- 32位整數 類型不可用。JavaScript僅支持64位浮點數,所以32位整數會被自動轉換。
- 64位整數 不支持這個類型。shell會使用一個特殊的內嵌文檔來顯示64位整數,
- 64位浮點數 shell中的數字都是這種類型。下面的表示都是浮點數: {"X" : 3.1415926} {"X" : 3}
- 字符串 UTF-8字符串都可表示為字符串類型的數據: {"x" : "foobar"}
- 符號 不支持這種類型。shell將數據庫里的符號類型轉換成字符串。
- 對象id 對象id是文檔的12字節的唯一 ID, {"X" :ObjectId() }
- 日期 日期類型存儲的是從標准紀元開始的毫秒數。不存儲時區: {"X" : new Date()}
- 正則表達式 文檔中可以包含正則表達式,采用JavaScript的正則表達式語法: {"x" : /foobar/i}
- 代碼 文檔中還可以包含JavaScript代碼:{"x" : function() { /* …… */ }}
- 二進制數據 二進制數據可以由任意字節的串組成。不過shell中無法使用。
- 最大值 BSON包括一個特殊類型,表示可能的最大值。shell中沒有這個類型。
- 最小值 BSON包括一個特殊類型,表示可能的最小值。shell中沒有這個類型。
- 未定義 文檔中也可以使用未定義類型:{"x":undefined}
- 數組 值的集合或者列表可以表示成數組:{"x" : ["a", "b", "c"]}
- 內嵌文檔 文檔可以包含別的文檔,也可以作為值嵌入到父文檔中,數據可以組織得更自然些,不用非得存成扁平結構的:{"x" : {"food" : "noodle"}}
數字
JavaScript中只有一種“數字”類型。因為MongoDB中有3種數字類型(32位整數、64位整數和64位浮點數),shell必須繞過JavaScript的限制。默認情況下,shell中的數字都被MongoDB當做是雙精度數。這意味着如果你從數據庫中獲得的是一個32位整數,修改文檔后,將文檔存回數據庫的時候,這個整數也被轉換成了浮點數,即便保持這個整數原封不動也會這樣的。所以明智的做法是盡量不要在shell下覆蓋整個文檔。
日期
JavaScript的Date對象用做MongoDB的日期類型,創建一個新的Date對象時,通常會調用new Data("")。
基本概念
下面將按照學習RDMS時先介紹類似行、表、數據庫概念的知識,然后在去學習增刪改查等操作。
1.文檔
文檔是MongoDB中數據的基本單元(類似於關系型數據庫中的行,但是比行要復雜得多)。多個鍵及其關聯的值有序地放置在一起便是文檔。MongoDB的文件存儲格式為BSON。
BSON是Binary JSON 的簡稱,是一個JSON文檔對象的二進制編碼格式。BSON同JSON一樣支持往其它文檔對象和數組中再插入文檔對象和數組,同時擴展了JSON的數據類型。如:BSON有Date類型和BinDate類型。BSON有三個特點:輕量性、可遍歷性、高效性
文檔就可以這樣表示:
{ "firstName": "egger", "lastName":"wong" }
注意點:
- 文檔中的鍵/值對是有序的。
- 文檔中的值不僅可以是在雙引號里面的字符串,還可以是其他幾種數據類型(甚至可以是整個嵌人的文檔)。
- MongoDB區分類型和大小寫。
- MongoDB的文檔不能有重復的鍵。
- 文檔的鍵是字符串。除了少數例外情況,鍵可以使用任意UTF-8字符。
- 鍵不能含有\0 (空字符)。這個字符用來表示鍵的結尾。
- .和$有特別的意義,只有在特定環境下才能使用。
- 以下划線"_"開頭的鍵是保留的(不是嚴格要求的)。
2.集合
集合就是一組文檔(類似於關系型數據庫中的表),可以被看做是沒有模式的表。
無模式
集合是無模式的。這意味着一個集合里面的文檔可以是各式各樣的。例如,下面兩個文檔可以存在於同一個集合里面:
{"name": "egger"}
{"age":18}
上面的文檔不光是值的類型不同(字符串和整數),它們的鍵也是完全不一樣的。
雖然集合里面可以放置任何文檔,但是推薦使用多個集合:
- 把各種各樣的文檔都混在一個集合里面,無論對於開發者還是管理員來說都是噩夢。
- 在一個集合里面査詢特定類型的文檔在速度上也很不划算,分開做多個集合要快得多。
- 把同種類型的文檔放在一個集合里,這樣數據會更加集中。
- 當創建索引的時候,文檔會有附加的結構(尤其是有唯一索引的時候)。索引是按照集合來定義的。把同種類型的文檔放入同一個集合里面,可以使索引更加有效。
命名
我們可以通過名字來標識集合。集合名可以是滿足下列條件的任意UTF-8字符串。
- 集合名不能是空字符串""。
- 集合名不能含有\0字符(空字符),這個字符表示集合名的結尾。
- 集合名不能以"system."開頭,這是為系統集合保留的前綴。
- 用戶創建的集合名字不能含有保留字符$。有些驅動程序的確支持在集合名里面包含$,這是因為某些系統生成的集合中包含該字符。除非你要訪問這種系統創建的集合,否則千萬不要在名字里出現$。
子集合
組織集合的一種慣例是使用"."字符分開的按命名空間划分的子集合。在MongoDB中使用子集合來組織數據是很好的方法
例如,一個個人信息可能包含兩個集合,分別是person.name和person.age。這樣做的目的只是為了使組織結構更好些,也就是說person這個集合(這里根本就不需要存在)及其子集合沒有任何關系。把數據庫的名字放到集合名前面,得到就是集合的完全限定名,稱為命名空間。命名空間的長度不得超過121字節,在實際使用當中應該小於100字節。
很多MongoDB工具中都包含子集合。
- GridFS是一種存儲大文件的協議,使用子集合來存儲文件的元數據,這樣就與內容塊分開了
- MongoDB的Web控制台通過子集合的方式將數據組織在DBTOP部分.
- 絕大多數驅動程序都提供語法糖,為訪問指定集合的子集合提供方便。
3.數據庫
MongoDB中多個集合可以組成數據庫。MongoDB的單個實例可以容納多個獨立的數據庫,每一個都有自己的集合和權限,不同的數據庫也放置在不同的文件中。
數據庫也通過名字來標識。數據庫名可以是滿足以下條件的任意UTF-8字符串。
- 不能是空字符串("")。
- 不得含有' '(空格)、.、$、/、\和\0 (空宇符)。
- 應全部小寫。
- 最多64字節。
有一些數據庫名是保留的,可以直接訪問這些有特殊作用的數據庫。
• admin
從權限的角度來看,這是“root”數據庫。要是將一個用戶添加到這個數據庫,這個用戶自動繼承所有數據庫的權限。一些特定的服務器端命令也只能從這個數據庫運行,比如列出所有的數據庫或者關閉服務器。
• local
這個數據永遠不會被復制,可以用來存儲限於本地單台服務器的任意集合
• config
當Mongo用於分片設置時,config數據庫在內部使用,用於保存分片的相關信息。