MongoDB固定集合和TTL集合
1、固定集合
MongoDB可以建立固定長度的集合,可以設定最大的集合空間或最大的集合數。建立集合的語法如下:
db.createCollection("collection-name", { option物件 }); # option都為可選物件,可選項如下:
可選引數 | 型別 | 說明 |
capped | boolean | 預設為false則為正常的集合,當設定為true時,則為固定長度集合,到達設定的空間或集合長度的上線,則會刪除最老的資料 |
autoIndexId |
boolean | 為true則在_id上自動建立索引。預設為true,為唯一索引,建立後就不能進行刪除索引 |
size |
數字(單位位元組) |
前提是capped設定為true。指定集合能使用的資料空間上限。 |
max |
數字(文件數) |
前提是capped設定為true。指定集合能使用的最大文件資料。當文件空間和最大文件數時,誰先到達限制都會觸發,而扔掉最老的文件 |
db.createCollection("user-max",{capped:true,size:1000000,max:10000,autoIndexId:true});
固定集合特點:
1、到達資料空間或者文件數的上限,則扔掉最老的文件
2、MySQL的資料copy使用的是binlog,而MongoDB資料copy則使用固定長度的集合
3、固定集合不能轉換為正常的集合,正常的集合可以轉化為固定集合,轉化方式如下:
db.runCommand({"covertToCapped":"collection-name", size:100000,max:1000});
2、TTL索引
使用固定集合的方式,不能確認會將哪些資料扔掉。很多時候我們需要儲存一段時候的資料,如前面提到的MongoDB應用中的使用--刪除舊資料場景。就可以在集合中根據每個文件定時刪除不需要的文件,若需要儲存資料,則可以讓大資料定時將資料抽取走。為集合的建立日期設定一個TTL索引,如下:
# 儲存最近三個月的文件(單位秒),當中途修改了createdAt的值時,則不會刪除文件(指定的時間是欄位與當前時間的差值)
db.user.createIndex({"createdAt": 1},{expireAfterSeconds: 60*60*24*3});
# 若需求變動,需要將三個月修改為一個月可以使用collMod,如下:
db.runCommand({collMod: 'user', index: {keyPattern:{"createdAt": 1}, expireAfterSeconds:60*60*24*1}});
TTL集合特點:
1、TTL索引是單欄位索引,不能使用在聚合索引上
2、_id主鍵上不能建立TTL索引
3、一個集合上可以建立多個TTL索引
4、不能在普通索引上再建立TTL索引,只能刪除再建
5、TTL索引可以用於普通索引一樣進行排序和查詢
6、TTL索引會每分鐘檢查超時文件,並進行刪除操作。需要注意刪除時候的併發問題(不要影響線上業務)。