前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >MongoDB的数据清理

MongoDB的数据清理

原创
作者头像
保持热爱奔赴山海
发布2024-09-03 18:28:35
发布2024-09-03 18:28:35
1730
举报
文章被收录于专栏:数据库相关数据库相关

对于保留固定时间窗口的collection,通常是使用 Capped Collections 类型的集合。

但是如果有些Collection希望自己控制删除数据的时间,则可以使用下面的这个脚本。

生成测试数据

代码语言:txt
复制
-- 注意下面插入的是 new Date("2023-01-01T00:00:00Z") 日期时间类型的,如果插入的是"2023-01-01 00:00:00" 则表示的是字符串类型,而不是时间类型!!
use testdb
db.tb1.insertOne({
    "name": "example1",
    "timestamp": new Date()
})

db.tb1.insertOne({
    "name": "example2",
    "timestamp": new Date("2023-01-01T00:00:00Z")
})

db.tb1.find()

数据清理脚本

代码语言:txt
复制
from pymongo import MongoClient
import datetime
import time

MONGO_URI = "mongodb://192.168.31.181:22017"


def clean_old_data_in_batches(
    db_name, collection_name, days_old, batch_size=100, sleep_time=2
):
    client = MongoClient(MONGO_URI)
    db = client[db_name]
    collection = db[collection_name]

    # 计算截止日期
    cutoff_date = str(datetime.datetime.utcnow() - datetime.timedelta(days=days_old))
    print(cutoff_date)

    while True:
        # 查找一小批过期文档
        old_docs = collection.find(
            {"timestamp": {"$lt": cutoff_date}}, limit=batch_size
        )
        print(old_docs)

        old_docs_count = old_docs.count()
        if old_docs_count == 0:
            break

        # 获取要删除文档的ID列表
        old_doc_ids = [doc["_id"] for doc in old_docs]
        # print(old_doc_ids)

        # 删除这一小批文档
        result = collection.delete_many({"_id": {"$in": old_doc_ids}})
        print(f"Deleted {result.deleted_count} documents.")

        # 避免对数据库造成过大压力
        time.sleep(sleep_time)

    client.close()
    print("Batch deletion completed.")


# 删除超过30天的数据,每批次删除1000条,间隔1秒
clean_old_data_in_batches("db1", "tb1", 30, batch_size=1000, sleep_time=1)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 生成测试数据
  • 数据清理脚本
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档