中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
mongodb指南(十) - developer zone - 集合

mongodb指南(十) - developer zone - 集合

分類: mongodb翻譯 582人閱讀 評論(0) 收藏 舉報

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:

  1. if( db.blog.posts.findOne() )  
  2. print("blog.posts exists and is not empty.");  

其他訪問集合的方法有:

  1. > db["mycol"].find()  
  2. > db.getCollection("mycol").find()  

盡管下劃線允許使用,但是在shell中如果第一個字符是下劃線則表示一個特殊函數(shù):shell認(rèn)為這個提示符是實際的javascript值,而不是一個集合名稱。所以此時使用"."標(biāo)示是不能訪問的,但是可以使用getCollection()來訪問。

  1. > db._mycol.find() --> error  
  2. > db.getCollection("_mycol").find() --> success  

定容量集合

定容量集合是固定大小的集合,它們擁有高性能自動-FIFO過期特征(過期是基于插入順序的)。它們有點(diǎn)類似于“RRD”的概念。

另外,定容量集合可以高性能的自動維護(hù)對象在集合中的插入順序;這在有些場合中的效率非常好,比如日志功能。

定容量集合是不能被分片的。

創(chuàng)建

不同于標(biāo)準(zhǔn)的集合,你必須顯式的創(chuàng)建一個定容量集合,指定集合大小,單位是字節(jié)。該集合的數(shù)據(jù)空間就會預(yù)分配好。提醒一下指定的大小包含了數(shù)據(jù)庫的頭信息。

  1. > db.createCollection("mycoll", {capped:true, size:100000})  

特性

  • 一旦空間用完,新添加的對象會覆蓋集合中的老對象。
  • 如果你執(zhí)行find()并且不指定排序,返回的對象永遠(yuǎn)是按照插入順序來排序。反向排序可以使用find().sort({$natural:-1})來得到。

使用和約束

  • 在定容量集合中,你可以添加新的對象。
  • 你可以更新集合中已經(jīng)存在的對象。但是,這些對象不能再增大空間了。如果這樣做了,更新會失敗。注意如果你在執(zhí)行更新,你可以聲明一個合適的索引(默認(rèn)情況下定容量集合沒有"_id"字段的索引)。
  • 數(shù)據(jù)庫不允許從定容量集合中刪除對象。使用drop()函數(shù)刪除集合中所有的行。(drop之后你必須顯式的重建這個集合)
  • 定容量集合不能被分片。

應(yīng)用

  • 日志.定容量集合為存儲日志文檔到數(shù)據(jù)庫提供了高性能的方法。插入對象到?jīng)]有索引的定容量集合和日志到一個文件系統(tǒng)的性能非常接近。另外,借助于內(nèi)建的FIFO機(jī)制,在日志應(yīng)用中你沒有超出磁盤空間的風(fēng)險。
  • 緩沖。如果你希望在數(shù)據(jù)庫中緩沖小數(shù)量的對象,或許緩沖一些計算信息,定容量集合提供了很方便的機(jī)制來實現(xiàn)它。注意在這種應(yīng)用中你需要在定容量集合上使用索引,因為這種應(yīng)用的讀頻率高于寫。
  • 自動存檔。如果你希望數(shù)據(jù)自動過期,定容量集合要比手寫cron scripts更加方便。

建議

  • 如果可以,不要在定容量集合上面建立索引。如果該集合的寫頻率遠(yuǎn)大于讀頻率,那最好沒有索引。注意你可以在一個定容量集合上面建立索引;但是,此時你會從“日志速度”插入變成了“數(shù)據(jù)庫速度”插入--這就是說,相比于數(shù)據(jù)庫標(biāo)準(zhǔn)它的速度依然很快。
  • 使用natural ordering來更有效的獲取最新插入的對象。這和在日志文件尾部追加數(shù)據(jù)(tail on a log file)有些類似。

可選項

大小

定容量集合的大小是必須指定的。

最大

你還可以固定集合中的對象個數(shù)。一旦這個限制達(dá)到了,最先插入的對象會被移出。

注意:當(dāng)指定對象個數(shù)時,你必須指定集合大小。一定要留有足夠的空間存儲限制的對象數(shù),否則對象移出速度會超乎你的想象。你可以使用validate()工具查看定容量集合使用的空間大小,并且從這里估計你需要的大小。

  1. db.createCollection("mycoll", {capped:true, size:100000, max:100});  
  2. db.mycoll.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你可以這樣做:

  1. > db.mycollection._mongo.insert(db.mycollection._fullName, myObjectWithoutAnId)  

檢查一個集合是否是定容量的

你可以使用shell中的函數(shù)isCapped()來檢查一個集合是否為定容量的。db.foo.isCapped()

將一個集合轉(zhuǎn)換為定容量的

你可以使用convertToCapped命令將一個(非定容量)集合轉(zhuǎn)換為定容量集合:

  1. > db.runCommand({"convertToCapped": "mycoll", size: 100000});  
  2. { "ok": 1 }  

createCollection命令

使用createCollection命令來顯示的創(chuàng)建一個集合。它通常被用來創(chuàng)建定容量集合。

  1. > # mongo shell  
  2. > db.createCollection("mycoll", {capped:true, size:100000})  
  3. > show collections  

大多數(shù)驅(qū)動還有一個創(chuàng)建集合的助手函數(shù)。你可以通過它運(yùn)行任何命令。

  1. > db.runCommand( {createCollection:"mycoll", capped:true, size:100000} )  

renameCollection命令

這個命令用來對已存在的集合重命名。

shell:

  1. > db.oldname.renameCollection("newname")  

在驅(qū)動中,你可以使用通用的命令語法來創(chuàng)建:

  1. > db.runCommand( { renameCollection: "mydb.oldname", to: "mydb.newname" }  

這個命令是原子執(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”中,類似于:

  1. { log : 'dev', ts : ..., info : ... }  

不過,如果記錄條數(shù)并不是很多的話,每種log使用一個集合會比較好一些。我們可以使用一個"logs.dev"集合,一個“l(fā)ogs.debug”集合,“l(fā)ogs.ops”,等:

  1. // logs.dev:  
  2. { ts : ..., info : ... }  

當(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。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MongoDB是什么,怎么用?看完你就知道了
mongoDB
MongoDB Windows下的安裝與部署 (二)
mongodb小結(jié) – 不周山
mongodb 總結(jié)
MongoDB運(yùn)行狀態(tài)、性能監(jiān)控,分析
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服