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