You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB时间序列文档未自动过期问题排查咨询

MongoDB时间序列集合文档未自动过期的问题排查与解决

核心问题原因

MongoDB时间序列集合的TTL(自动过期)机制和普通集合存在差异,直接在Schema中配置expireAfterSeconds不会生效,必须针对时间序列指定的timeField手动创建TTL索引。

具体解决步骤

  1. 移除无效Schema配置
    先删除@Schema装饰器中的expireAfterSeconds: 4000,该配置对时间序列集合不生效。

  2. 手动创建TTL索引
    在NestJS的服务或模块初始化阶段,为time字段创建TTL索引:

    import { InjectModel } from '@nestjs/mongoose';
    import { Model } from 'mongoose';
    import { RateTickerEventData } from './path-to-your-schema';
    
    // 在服务类中
    constructor(
      @InjectModel(RateTickerEventData.name)
      private rateTickerModel: Model<RateTickerEventData>,
    ) {}
    
    async onModuleInit() {
      // 为time字段创建TTL索引,设置过期时间4000秒
      await this.rateTickerModel.collection.createIndex(
        { time: 1 },
        { expireAfterSeconds: 4000 }
      );
    }
    
  3. 验证索引创建状态
    通过MongoDB Shell执行以下命令,确认索引是否成功创建:

    db.rateTickerEventDatas.getIndexes()
    

    需确保结果中存在基于time字段、带有expireAfterSeconds: 4000的TTL索引。

额外注意事项

  • TTL删除是MongoDB后台异步任务,默认每60秒执行一次,文档不会在到期瞬间立即删除,可能需要等待1-2分钟才能看到效果。
  • 确保time字段存储的是标准Date类型,若为字符串或其他类型,TTL索引将无法正常工作。
  • 时间序列集合的TTL索引仅能建在配置的timeField上,无法作用于其他字段(如createdAt)。

内容的提问来源于stack exchange,提问作者Sar AN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 15:54:36