MongoDB时间序列文档未自动过期问题排查咨询
MongoDB时间序列集合文档未自动过期的问题排查与解决
核心问题原因
MongoDB时间序列集合的TTL(自动过期)机制和普通集合存在差异,直接在Schema中配置expireAfterSeconds不会生效,必须针对时间序列指定的timeField手动创建TTL索引。
具体解决步骤
移除无效Schema配置
先删除@Schema装饰器中的expireAfterSeconds: 4000,该配置对时间序列集合不生效。手动创建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 } ); }验证索引创建状态
通过MongoDB Shell执行以下命令,确认索引是否成功创建:db.rateTickerEventDatas.getIndexes()需确保结果中存在基于
time字段、带有expireAfterSeconds: 4000的TTL索引。
额外注意事项
- TTL删除是MongoDB后台异步任务,默认每60秒执行一次,文档不会在到期瞬间立即删除,可能需要等待1-2分钟才能看到效果。
- 确保
time字段存储的是标准Date类型,若为字符串或其他类型,TTL索引将无法正常工作。 - 时间序列集合的TTL索引仅能建在配置的
timeField上,无法作用于其他字段(如createdAt)。
内容的提问来源于stack exchange,提问作者Sar AN
相关产品推荐
相关产品推荐

