mongodb集合實質(zhì)上就是一組文檔的名稱。你可以認(rèn)為它們大體上等同于關(guān)系型數(shù)據(jù)庫中的表。
概述
一個mongodb集合是一個BSON格式文檔的集合。這些文檔通常有著相同的結(jié)構(gòu),但是這并不是必須的,因為mongodb是模式自由(或者更準(zhǔn)確的說,“動態(tài)模式”)的數(shù)據(jù)庫。你可以在同一個集合內(nèi)存儲多種多樣的文檔,而且你不需要預(yù)先定義集合的“列”或者字段。
一個集合在第一個文檔插入時創(chuàng)建。
集合名稱應(yīng)當(dāng)以字母或者下劃線開始并且可以包含字母;$是保留字符。集合可以使用命名空間進(jìn)行劃分;這些集合組的命名使用“.”(點(diǎn))來定義。例如,你可以定義集合blog.posts和blog.authors,都屬于"blog"的命名空間。注意這只是個方便用戶管理的機(jī)制--從數(shù)據(jù)庫的角度看,集合命名空間是平面的。
集合名稱最多可以包含128字符(包括數(shù)據(jù)庫和索引的名稱)。最好將它控制在80/90個字符。
shell
以編程方式,我們使用"."標(biāo)記訪問這些集合。例如,使用mongo shell:
其他訪問集合的方法有:
盡管下劃線允許使用,但是在shell中如果第一個字符是下劃線則表示一個特殊函數(shù):shell認(rèn)為這個提示符是實際的javascript值,而不是一個集合名稱。所以此時使用"."標(biāo)示是不能訪問的,但是可以使用getCollection()來訪問。
定容量集合是固定大小的集合,它們擁有高性能自動-FIFO過期特征(過期是基于插入順序的)。它們有點(diǎn)類似于“RRD”的概念。
另外,定容量集合可以高性能的自動維護(hù)對象在集合中的插入順序;這在有些場合中的效率非常好,比如日志功能。
定容量集合是不能被分片的。
創(chuàng)建
不同于標(biāo)準(zhǔn)的集合,你必須顯式的創(chuàng)建一個定容量集合,指定集合大小,單位是字節(jié)。該集合的數(shù)據(jù)空間就會預(yù)分配好。提醒一下指定的大小包含了數(shù)據(jù)庫的頭信息。
特性
使用和約束
應(yīng)用
建議
可選項
大小
定容量集合的大小是必須指定的。
最大
你還可以固定集合中的對象個數(shù)。一旦這個限制達(dá)到了,最先插入的對象會被移出。
注意:當(dāng)指定對象個數(shù)時,你必須指定集合大小。一定要留有足夠的空間存儲限制的對象數(shù),否則對象移出速度會超乎你的想象。你可以使用validate()工具查看定容量集合使用的空間大小,并且從這里估計你需要的大小。
autoIndexId
autoIndexId字段可以設(shè)為true或者false來顯示的使能或者禁止在_id字段自動創(chuàng)建唯一索引。
如果你會用到_id字段,你就應(yīng)當(dāng)在_id字段創(chuàng)建一個索引。
鑒于有些時候并不會使用_id索引,不使用_id字段對插入會很有幫助。大部分驅(qū)動和mongo shell在客戶端增加_id。查看各驅(qū)動文檔如何取消這一功能(不同驅(qū)動表現(xiàn)可能不同)。在mongo shell你可以這樣做:
檢查一個集合是否是定容量的
你可以使用shell中的函數(shù)isCapped()來檢查一個集合是否為定容量的。db.foo.isCapped()
將一個集合轉(zhuǎn)換為定容量的
你可以使用convertToCapped命令將一個(非定容量)集合轉(zhuǎn)換為定容量集合:
createCollection命令
使用createCollection命令來顯示的創(chuàng)建一個集合。它通常被用來創(chuàng)建定容量集合。
大多數(shù)驅(qū)動還有一個創(chuàng)建集合的助手函數(shù)。你可以通過它運(yùn)行任何命令。
renameCollection命令
這個命令用來對已存在的集合重命名。
shell:
在驅(qū)動中,你可以使用通用的命令語法來創(chuàng)建:
這個命令是原子執(zhí)行的,在生產(chǎn)版本DB上面運(yùn)行應(yīng)當(dāng)是安全的。它改變了和這個集合相關(guān)的元數(shù)據(jù)并從舊的命名空間拷貝索引元數(shù)據(jù)到新的命名空間。執(zhí)行這個命令所花時間是恒定的,并且和集合或者索引的大小無關(guān)。如果重命名時在這個集合上面已經(jīng)有一個打開的游標(biāo),那么這個游標(biāo)會變得無效并且不能獲取任何數(shù)據(jù)。
使用大數(shù)量的集合
在使用mongodb的很多場合,有一個小技巧是使用多個集合存儲信息代替使用單個集合.通過這種方式,一些重復(fù)數(shù)據(jù)不再需要存儲在每個對象中,建立它上面的索引就可以刪除了。更重要的是為了性能(基于這個問題),數(shù)據(jù)可以被指定的組操作進(jìn)行聚集。
例如,假定我們記錄對象/文檔到數(shù)據(jù)庫,并需要有M條記錄:可能一條dev記錄,一條debug記錄,一個ops記錄等等。我們可以把他們都存儲在同一個集合“l(fā)ogs”中,類似于:
不過,如果記錄條數(shù)并不是很多的話,每種log使用一個集合會比較好一些。我們可以使用一個"logs.dev"集合,一個“l(fā)ogs.debug”集合,“l(fā)ogs.ops”,等:
當(dāng)然,這也只有在我們不需要同時查詢多種類型log的情況下才有意義。
通常情況下,使用大量集合沒有顯著的性能缺陷,相反會帶來很好的性能表現(xiàn)。
限制
默認(rèn)情況下,mongodb中對每個數(shù)據(jù)庫可以使用的集合限定在24000個命名空間.每個命名空間是628字節(jié),.ns文件默認(rèn)是16MB。
每一個集合被記為一個命名空間,每一個索引也同樣記為一個命名空間。這樣如果每個集合有一個索引,我們可以創(chuàng)建最多12000個集合。參數(shù)--nssize允許你增大這個限制。
提醒一下每個集合有一個最小空間開銷--一些KB。更進(jìn)一步,任何索引會需要至少8KB數(shù)據(jù)空間,因為b-tree也大小是8KB。如果這里有大量的集合,那么由于元數(shù)據(jù)會paged out,一些操作會變慢。
--nssize
如果需要更多集合,指定--nssize來運(yùn)行mongodb。這會讓<database>.ns文件變大并支持更多集合。注意--nssize僅影響新建的.ns文件 -- 如果你已經(jīng)有個數(shù)據(jù)庫并想調(diào)整大小,在使用--nssize運(yùn)行數(shù)據(jù)庫后,在從shell中運(yùn)行db.repairDatabase()來調(diào)整大小。
.ns文件最大為2GB。
聯(lián)系客服