mongodb指南(翻譯)(十) – developer zone – 集合

來源:互聯網
上載者:User

mongodb集合實質上就是一組文檔的名稱。你可以認為它們大體上等同於關係型資料庫中的表。

概述

一個mongodb集合是一個BSON格式文檔的集合。這些文檔通常有著相同的結構,但是這並不是必須的,因為mongodb是模式自由(或者更準確的說,“動態模式”)的資料庫。你可以在同一個集合記憶體儲多種多樣的文檔,而且你不需要預先定義集合的“列”或者欄位。

 

一個集合在第一個文檔插入時建立。

 

集合名稱應當以字母或者底線開始並且可以包含字母;$是保留字元。集合可以使用命名空間進行劃分;這些集合組的命名使用“.”(點)來定義。例如,你可以定義集合blog.posts和blog.authors,都屬於"blog"的命名空間。注意這隻是個方便使用者管理的機制--從資料庫的角度看,集合命名空間是平面的。

集合名稱最多可以包含128字元(包括資料庫和索引的名稱)。最好將它控制在80/90個字元。

shell

以編程方式,我們使用"."標記訪問這些集合。例如,使用mongo shell:

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

其他訪問集合的方法有:

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

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

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

 

定容量集合

定容量集合是固定大小的集合,它們擁有高效能自動-FIFO到期特徵(到期是基於插入順序的)。它們有點類似於“RRD”的概念。

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

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

建立

不同於標準的集合,你必須顯式的建立一個定容量集合,指定集合大小,單位是位元組。該集合的資料空間就會預分配好。提醒一下指定的大小包含了資料庫的頭資訊。

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

特性

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

使用和約束

  • 在定容量集合中,你可以添加新的對象。
  • 你可以更新集合中已經存在的對象。但是,這些對象不能再增大空間了。如果這樣做了,更新會失敗。注意如果你在執行更新,你可以聲明一個合適的索引(預設情況下定容量集合沒有"_id"欄位的索引)。
  • 資料庫不允許從定容量集合中刪除對象。使用drop()函數刪除集合中所有的行。(drop之後你必須顯式的重建這個集合)
  • 定容量集合不能被分區。

應用

  • 日誌.定容量集合為儲存日誌文檔到資料庫提供了高效能的方法。插入對象到沒有索引的定容量集合和日誌到一個檔案系統的效能非常接近。另外,藉助於內建的FIFO機制,在日誌應用中你沒有超出磁碟空間的風險。
  • 緩衝。如果你希望在資料庫中緩衝小數量的對象,或許緩衝一些計算資訊,定容量集合提供了很方便的機制來實現它。注意在這種應用中你需要在定容量集合上使用索引,因為這種應用的讀頻率高於寫。
  • 自動封存。如果你希望資料自動到期,定容量集合要比手寫cron scripts更加方便。

建議

  • 如果可以,不要在定容量集合上面建立索引。如果該集合的寫頻率遠大於讀頻率,那最好沒有索引。注意你可以在一個定容量集合上面建立索引;但是,此時你會從“日誌速度”插入變成了“資料庫速度”插入--這就是說,相比於資料庫標準它的速度依然很快。
  • 使用natural ordering來更有效擷取最新插入的對象。這和在記錄檔尾部追加資料(tail on a log file)有些類似。

可選項

大小

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

最大

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

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

db.createCollection("mycoll", {capped:true, size:100000, max:100});
db.mycoll.validate();

autoIndexId

autoIndexId欄位可以設為true或者false來顯示的使能或者禁止在_id欄位自動建立唯一索引。

如果你會用到_id欄位,你就應當在_id欄位建立一個索引。

鑒於有些時候並不會使用_id索引,不使用_id欄位對插入會很有協助。大部分驅動和mongo shell在用戶端增加_id。查看各驅動文檔如何取消這一功能(不同驅動表現可能不同)。在mongo shell你可以這樣做:

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

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

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

將一個集合轉換為定容量的

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

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

createCollection命令

使用createCollection命令來顯示的建立一個集合。它通常被用來建立定容量集合。

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

大多數驅動還有一個建立集合的助手函數。你可以通過它運行任何命令。

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

renameCollection命令

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

shell:

> db.oldname.renameCollection("newname")

在驅動中,你可以使用通用的命令文法來建立:

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

這個命令是原子執行的,在生產版本DB上面運行應當是安全的。它改變了和這個集合相關的中繼資料並從舊的命名空間拷貝索引中繼資料到新的命名空間。執行這個命令所花時間是恒定的,並且和集合或者索引的大小無關。如果重新命名時在這個集合上面已經有一個開啟的遊標,那麼這個遊標會變得無效並且不能擷取任何資料。

 

使用大數量的集合

在使用mongodb的很多場合,有一個小技巧是使用多個集合儲存資訊代替使用單個集合.通過這種方式,一些重複資料不再需要儲存在每個對象中,建立它上面的索引就可以刪除了。更重要的是為了效能(基於這個問題),資料可以被指定的組操作進行聚集。

例如,假定我們記錄對象/文檔到資料庫,並需要有M條記錄:可能一條dev記錄,一條debug記錄,一個ops記錄等等。我們可以把他們都儲存在同一個集合“logs”中,類似於:

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

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

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

當然,這也只有在我們不需要同時查詢多種類型log的情況下才有意義。

通常情況下,使用大量集合沒有顯著的效能缺陷,相反會帶來很好的效能表現。

限制

預設情況下,mongodb中對每個資料庫可以使用的集合限定在24000個命名空間.每個命名空間是628位元組,.ns檔案預設是16MB。

每一個集合被記為一個命名空間,每一個索引也同樣記為一個命名空間。這樣如果每個集合有一個索引,我們可以建立最多12000個集合。參數--nssize允許你增大這個限制。

提醒一下每個集合有一個最小空間開銷--一些KB。更進一步,任何索引會需要至少8KB資料空間,因為b-tree也大小是8KB。如果這裡有大量的集合,那麼由於中繼資料會paged out,一些操作會變慢。

--nssize

如果需要更多集合,指定--nssize來運行mongodb。這會讓<database>.ns檔案變大並支援更多集合。注意--nssize僅影響建立的.ns檔案 -- 如果你已經有個資料庫並想調整大小,在使用--nssize運行資料庫後,在從shell中運行db.repairDatabase()來調整大小。

.ns檔案最大為2GB。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.