Spring Boot MongoDB expireAfterSeconds索引无法自动删除文档求助
嗨,我来帮你排查下这个TTL配置的问题,从你给出的信息来看,大概率是这几个点导致的:
1. 别着急,TTL清理不是实时的
MongoDB的TTL后台清理任务默认是每分钟跑一次,哪怕你设置了15秒过期,文档也不会掐着点15秒整就被删掉,最快也要等下一次清理任务启动——也就是最多可能要等1分钟左右。你可以多等个1分半钟再去查数据库,说不定已经被清掉了。
2. 检查createdDateTime字段有没有赋值
TTL索引只对有有效日期值的字段生效,如果你插入文档的时候,createdDateTime是null或者没设置值,那这个索引等于白搭。
赶紧看看你保存UserRegistration的代码,是不是漏了给这个字段设值?比如应该加这么一行:
UserRegistration reg = new UserRegistration(); // 其他字段赋值... reg.setCreatedDateTime(new Date()); // 必须设置当前时间或者有效日期 mongoTemplate.save(reg);
3. 确认索引真的正确创建了
你可以登录MongoDB Shell,执行这条命令看看索引详情:
db.AccountRegistration.getIndexes()
正常的TTL索引应该能看到expireAfterSeconds: 15的配置,并且关联的是createdDateTime字段。如果看不到这个配置,那说明索引没创建成功。
另外,Spring Boot默认会自动创建实体类上的索引,但如果你的配置里关了这个功能(比如spring.data.mongodb.auto-index-creation=false),那索引就不会自动生成。去检查下你的application配置文件,把这个开关打开:
spring.data.mongodb.auto-index-creation=true
4. 版本兼容性要注意
Spring Boot 2.0.2对应的Spring Data MongoDB是2.0.x版本,这个版本要求MongoDB服务器至少是3.2以上。如果你的MongoDB版本太低,TTL索引的功能可能没法正常工作。可以在Shell里输db.version()看看服务器版本是不是达标。
按照这几步排查下来,应该就能解决问题啦!
内容的提问来源于stack exchange,提问作者iSmo

