1. 程式人生 > >MongoDB固定集合和TTL集合

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索引會每分鐘檢查超時文件,並進行刪除操作。需要注意刪除時候的併發問題(不要影響線上業務)。