MongoDB实现自动数据过期删除

597 阅读3分钟

场景

  • 爬虫采集的数据,非常多。都通过etl工具,抽取到了业务库,mongo数据不需要了,释放节省磁盘空间
  • 机器生成的事件数据、日志和会话信息,这些信息只需要在数据库中保存有限的时间

代码

  1. 首先确保您已安装pymongo库。可以使用pip进行安装:
pip install pymongo
  1. 使用以下Python代码来存储数据并设置过期时间:
from pymongo import MongoClient
from datetime import datetime, timedelta

# 连接MongoDB
client = MongoClient('localhost', 27017)
db = client['test_database']  # 使用或创建一个名为'test_database'的数据库
collection = db['test_collection']  # 使用或创建一个名为'test_collection'的集合

# 创建一个名为'expire_at'的索引并设置为TTL (time-to-live)
collection.create_index("expire_at", expireAfterSeconds=0)

# 存储一个文档并设置过期时间为5分钟后
expire_time = datetime.utcnow() + timedelta(minutes=5)
document = {"data": "This is some data", "expire_at": expire_time}
collection.insert_one(document)

print("Data inserted with expiration set for 5 minutes from now.")

上述代码首先连接到本地的MongoDB数据库,并选择一个数据库和集合。然后,它为集合创建了一个TTL索引,并插入了一个文档,该文档设置了一个过期时间。

当文档的expire_at字段达到其设置的时间时,MongoDB会自动删除它。

为什么上述代码中 expireAfterSeconds 设置为 0?

在MongoDB中,当您设置TTL (time-to-live) 索引的expireAfterSeconds属性为0时,这意味着文档的过期时间是基于索引字段中的日期时间来确定的。换句话说,文档的过期时间完全取决于索引字段(通常是一个日期字段)中的值。

考虑以下情况:

  1. 如果您在文档中设置了expire_at字段的值为某个将来的时间点,例如5分钟后,并且设置了expireAfterSeconds=0,则文档将在该将来的时间点自动过期并被删除。

  2. 如果您将expireAfterSeconds设置为一个非零值,例如3600(1小时),那么文档的实际过期时间将是索引字段中的日期时间加上这1小时。

因此,当您希望文档基于具体的日期时间过期时,应将expireAfterSeconds设置为0。这给予了更大的灵活性,因为您可以为每个文档指定不同的过期时间。

那么MySQL这可以设置数据自动删除吗?

  1. 使用事件调度器 (Event Scheduler)

    MySQL的事件调度器可以定期执行SQL命令,包括删除操作。首先,确保事件调度器已启用:

    SET GLOBAL event_scheduler = ON;
    

    然后,您可以创建一个事件,例如每天删除超过一定日期的记录:

    CREATE EVENT delete_old_data
    ON SCHEDULE EVERY 1 DAY
    STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY)
    DO
    DELETE FROM your_table WHERE your_date_column < DATE_SUB(NOW(), INTERVAL 30 DAY);
    

    上述代码会每天自动删除your_tableyour_date_column超过30天的记录。

  2. 使用触发器 (Trigger)

    如果数据的插入或更新与您想要删除的数据有关,您可以使用触发器。例如,当新数据插入时,删除旧数据:

    DELIMITER //
    CREATE TRIGGER after_data_insert AFTER INSERT ON your_table
    FOR EACH ROW 
    BEGIN
        DELETE FROM your_table WHERE your_date_column < DATE_SUB(NOW(), INTERVAL 30 DAY);
    END;
    //
    DELIMITER ;
    
  3. 使用外部脚本

    使用Python、Shell、PHP等语言编写一个脚本,该脚本连接到数据库并执行删除操作,然后使用cron或其他任务调度工具定期运行这个脚本。

在选择适合您的方法时,务必考虑到数据库的性能和其他需要,以及确保在实际删除数据之前进行备份,以避免任何意外的数据丢失。

可以看出,还是MongoDB 方便。

参考:官方文档TTL 索引 - MongoDB-CN-Manual (mongoing.com)