SpringBoot MongoDB TimeSeries集合设置expireAfterSeconds不生效问题咨询
问题原因分析
- 时序集合的TTL过期规则不支持通过普通字段索引的
expireAfterSeconds配置:MongoDB对时序集合的自动过期有专属配置规则,不能像普通集合一样直接在时间字段上加带过期属性的索引实现,你加在timestamp字段上的索引配置不会被时序集合识别。 @TimeSeries注解本身提供专属的过期配置参数:spring-data-mongodb针对时序集合的TTL能力,是直接在@TimeSeries注解上通过expireAfterSeconds属性声明,不需要额外在时间字段加索引配置。- 已存在的集合不会自动更新配置:如果你的
temp集合已经在数据库中创建过,后续修改实体类注解不会自动触发集合配置更新,需要手动删除旧集合或者手动修改集合过期属性。
正确配置方案
修改实体类配置如下:
@TimeSeries(collection = "temp", timeField = "timestamp", metaField = "probeId", granularity = Granularity.SECONDS, // 直接在@TimeSeries注解配置过期时间 expireAfterSeconds = 60) public final class Temperature { public String probeId; // 移除字段上的@Indexed过期配置,时序集合时间字段默认会被索引 public Instant timestamp; public int value; public Temperature () { } }
生效注意事项
- 若你是首次创建该集合,重启Spring Boot应用后框架会自动创建带TTL规则的时序集合,过期配置自动生效。
- 若集合已经存在,可选择两种处理方式:
- 测试环境可直接删除已存在的
temp集合,重启应用后自动重建即可生效。 - 生产环境可通过MongoDB shell执行命令修改现有集合的过期属性:
db.runCommand({ collMod: "temp", expireAfterSeconds: 60 })
- 测试环境可直接删除已存在的
- 验证配置是否生效可执行MongoDB命令:
db.getCollectionInfos({name:"temp"}),查看返回结果中的options.expireAfterSeconds字段是否为你设置的数值。
内容的提问来源于stack exchange,提问作者provincjalc
相关产品推荐
相关产品推荐

