1. 程式人生 > >mongodb 設定自動刪除過期資料

mongodb 設定自動刪除過期資料

Time To Live(TTL) 集合

MongoDB 2.2 引入一個新特性–TTL 集合,TTL集合支援失效時間設定,或者在某個特定時間,
集合自動清除超時文件,者用來儲存一個諸如session會話資訊的時候非常有用。

如果想使用TTL集合,用用到 expireAfterSeconds 選項

mongo

官網使用文件設定方法:

Expire Documents after a Specified Number of Seconds

首先建立索引,設定過期時間

db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600
} )

然後儲存資料入庫

db.log_events.insert( {
   "createdAt": new Date(),
   "logEvent": 2,
   "logMessage": "Success!"
} )

mongodb 會在 createdAt 數值大於 expireAfterSeconds 指定的值。

Expire Documents at a Specific Clock Time

與上面的設定類似
首先建立索引,設定 expireAfterSeconds 為 0

db.log_events.createIndex( { "expireAt"
: 1 }, { expireAfterSeconds: 0 } )

然後儲存資料

db.log_events.insert( {
   "expireAt": new Date('July 22, 2013 14:00:00'),
   "logEvent": 2,
   "logMessage": "Success!"
} )

expireAt 的值為特定的時間值,等時間到達expireAt的值時,這個文件就 失效了。

pymongo

由於自己使用python進行mongodb的使用,程式如下
1 設定文件在66秒後過期。

from pymongo import MongoClient
import pymongo
import datetime

client = MongoClient("10.168.99.118"
, 27017) collection = client.test.expire collection.create_index([("time", pymongo.ASCENDING)], expireAfterSeconds=66) data = { "one": 1, "two": 235, "time": datetime.datetime.utcnow(), } collection.insert(data)

2 設定特定時間

from pymongo import MongoClient
import pymongo
import datetime

client = MongoClient("10.168.99.118", 27017)
collection = client.test.expire
collection.create_index([("time", pymongo.ASCENDING)], expireAfterSeconds=0)

data = {
   "one": 1,
   "two": 235,
   "time": datetime.datetime.utcnow()+ datetime.timedelta(seconds=66),
}
collection.insert(data)

注意,上面的時間使用的是datetime.datetime.utcnow() 而不是 datetime.datetime.now(), 這兩者的時間是有差別的,資料存入mongodb的客戶端中可以看得到。
現在時間是 2017-02-09 14:36
第一條資料使用 datetime.datetime.utcnow() 的時間
第二條資料使用 datetime.datetime.now() 的時間

這裡寫圖片描述

所以,第二條資料會在晚上 10點多才會過期。

mongoengine

自己使用的Django中的資料庫也是mongodb。

from mongoengine import *
import datetime
import time
connect('test', host='10.168.99.118', port=27017)
class Session(Document):
   created = DateTimeField(default=datetime.datetime.utcnow()-datetime.timedelta(seconds=60))
   last = DateTimeField(default=datetime.datetime.utcnow())
   num = IntField(unique=True)
   count = IntField(default=0)
   meta = {
       'indexes': [
           {'fields': ['created'], 'expireAfterSeconds': 66}
       ]
   }
s = Session.objects(num=51)
if len(s)>0:
   print(s[0].count)
else:
   b = s[0]
   b.num = 51
   b.count = 2
   b.save()

修改成特定時間過期的方式與pymongo中的類似。