7

我正在尝试将文档插入 Mongo 数据库并让它在预定时间后自动过期。到目前为止,即使我将“expireAfterSeconds”设置为更长的时间,我的文档也会在 0 到 60 秒内被插入但总是从数据库中删除。我知道 mongodb 大约每 60 秒删除一次过期的文档,因此“expredAfterSeconds”变量似乎不起作用。

我在这里遵循了文档: Mongodb TTL Docs

这是我的测试代码,应该在 3 分钟后过期(删除)文档(但它会在一分钟内完成):

import pymongo
import datetime

mongo_con = pymongo.Connection('localhost', 27017)
mongo_db = mongo_con.Mongo_database
mongo_col = mongo_db.my_TTL_collection

timestamp = datetime.datetime.now()

mongo_col.ensure_index("date", expireAfterSeconds=3*60)                     

mongo_col.insert({'_id': 'login_session', "date": timestamp, "session": "test session"})

有人知道问题是什么吗?

4

2 回答 2

18

您的问题来自在本地时区使用天真的时间戳。pymongo的常见问题解答有一个条目,其中包含一个警告 not to use datetime.datetime.now()。使用utcnowttl- 设置按预期工作:

import pymongo
import datetime

mongo_con = pymongo.Connection('localhost', 27017)
mongo_db = mongo_con.Mongo_database
mongo_col = mongo_db.my_TTL_collection

timestamp = datetime.datetime.now()
utc_timestamp = datetime.datetime.utcnow()

mongo_col.ensure_index("date", expireAfterSeconds=3*60)                     

mongo_col.insert({'_id': 'session', "date": timestamp, "session": "test session"})
mongo_col.insert({'_id': 'utc_session', "date": utc_timestamp, "session": "test session"})
# the utc_session will be deleted after around 3 minutes, 
# the other depending on your timezone
于 2013-12-06T20:44:00.800 回答
5

对于 Pymongo 3,这是更新的语法。

mongo_collection.create_index("date", expireAfterSeconds=3*60)
于 2016-07-20T05:24:08.043 回答