關鍵詞: expireAfterSeconds、TTL
TTL Time to Live
類似Redis中的expire機制,MongoDB也可以設置過期自動刪除的表。
MongoDB的過期設置依賴索引(TTL-index),設置過期字段使用的索引后,插入數據時在該字段指定日期時間,
經過在創建索引時指定的秒數后,該記錄會被MongoDB認為已經過期,然后刪除。
JS版
db.test_timer.createIndex({"timer":1}, {expireAfterSeconds: 10}) db.test_timer.insert({"timer":new Date(), "a":'abc'}) // 指定當前時間 db.test_timer.insert({"timer": new Date("2017/3/25 13:11:00"), "c": "CC"}) // 指定任意時間
Python版
創建索引和指定過期時間的方式類似,要注意的是過期時間的字段必須使用UTC時間,否則無法正常刪除記錄
因此指定過期時間刪除雖然也可以起作用,但是不能確定刪除時間非常精確。
from pymongo import MongoClient cli = MongoClient() db = cli['test'] tbl = db['test_timer2'] tbl.create_index([("timer2", 1)], expireAfterSeconds=10) from datetime import datetime tbl.insert({"timer2": datetime.utcnow(), "user": "Hehehehe!"}) from time import strptime, time, mktime t1 = strptime("2017/3/25 13:36:02", "%Y/%m/%d %H:%M:%S") t2 = datetime.utcfromtimestamp(mktime(t1)) tbl.insert({"timer2": t2, "CC": 12345}) tbl.insert({"timer2": 123, "TT": 1}) # TTL-index字段也可以是其他值,這是就不能被自動刪除 cli.close()
經過測試,實際刪除數據的時間與索引加上數據指定的時間點之間存在偏移,可能是MongoDB刪除數據機制的問題。