固定集合是固定大小的集合,支持高吞吐量的基於插入順序的插入和檢索文檔操做。固定集合使用一種相似循環緩衝區的方式進行工做。一旦集合填滿了其分配的空間,那麼新的文檔將會覆蓋集合中最老的文檔。
建立固定集合可經過查看createCollection()
或者create
來查看更多信息。javascript
固定集合保證保存的插入順序。所以,在順序插入的時候返回文檔不須要索引。java
爲新的文檔騰出空間,固定集合會自動移除集合中最老的文檔,而不用任何腳本或者明確的移除操做。例如, oplog.rs 集合在副本集中使用固定集合存儲日誌的操做。考慮如下固定集合的使用情形:mongodb
保存大容量系統生成的日誌信息,在一個沒有索引的固定集合中插入文檔與直接在文件系統中寫入日誌信息所花費的時間很是接近。此外,內置的先入先出策略保證了事件的順序,同時管理內存的使用。segmentfault
在固定集合中緩存了少許的數據。因爲是緩存是讀取而不是大批量的寫,you would either need to ensure that this collection always remains in the working set (即在RAM中) or accept some write penalty for the required index or indexes.緩存
固定集合默認狀況下有一個_id
字段和_id
字段索引。app
若是你計劃在固定集合中更新文檔,建立一個索引,這樣更新操做不須要請求集合掃描。ui
在3.2版本中改變
若是一個更新或者替換操做將會改變文檔的大小,那麼操做將會失敗。this
你不能從一個固定集合中刪除文檔。從一個集合中移除全部的文檔,使用drop()
方法來刪除集合和重建固定集合。日誌
你不能分片一個固定集合。code
使用天然順序從集合中高效的檢索最近插入的元素。這(有點)相似於在一個日誌文件上跟蹤。
聚合管道操做$out
不能將結果寫入到固定集合中。
你必須使用db.createCollection()
方法顯式的建立一個固定集合。這是 Mongo Shell 一個建立命令,當建立一個固定集合的時候,你必須指定集合的最大值(以字節爲單位),MongoDB將會對集合進行預先分配。這個固定集合的大小包含用於內部開銷的少許空間:
db.createCollection( "log", { capped: true, size: 100000 } )
若是size
字段小於或者等於4096,而後集合的上限是4096字節。不然,MongoDB將會提高size
的大小爲256的整倍數。
此外,你也能夠在下面的文檔使用max
字段爲集合指定一個文檔的最大值。
db.createCollection("log", { capped : true, size : 5242880, max : 5000 } )
重要:即便你爲文檔指定最大值,
size
參數也是必須的。若是一個集合在達到最大文檔數量以前,它的大小達到了最大值,那麼MongoDB將會移除最老的文檔.
若是你想在一個固定集合中執行沒有指定排序的find
命令。那麼MongoDB保證查詢出來的結果順序跟插入順序是相同的。
使用反向插入順序檢索文檔,使用find()
方法帶着$natural
參數設置爲-1
的sort()
方法, 如如下示例所示:
db.cappedCollection.find().sort( { $natural: -1 } )
使用isCapped()
方法來判斷一個集合是不是固定集合:
db.collection.isCapped()
你可使用convertToCapped
命令來將一個非固定集合轉化爲固定集合:
db.runCommand({"convertToCapped": "mycoll", size: 100000});
在固定集合中size
參數指定的大小單位爲字節。
警告:這個命令將得到全局寫鎖,而且將會阻止其餘操做,直至命令完成。
當數據過時以後,爲了進一步加強靈活性,考慮到MongoDB的TTL索引。綜上所述,集合經過設置TTL來過時數據。這些索引容許你從正常的集合中使用特定的類型,基於日期類型的字段值和TTL值索引來過時和移除數據。
TTL集合不兼容固定集合。
你能夠在固定集合中使用Tailable 遊標
,相似於Linux的tail -f
命令,Tailable 遊標 會追蹤
固定集合的末尾。做爲新的文檔插入到固定集合,你可使用Tailable 遊標
來繼續檢索文檔。
在建立Tailable 遊標
的時候能夠查看Tailable 遊標
來獲取更多信息。
下一章:https://segmentfault.com/a/11...
本文連接:https://docs.mongodb.com/manu...