MongoDB多久检查一次索引' expireAfterSeconds'?

时间:2018-01-09 08:37:21

标签: java mongodb spring-data-mongodb

我在本地使用单个实例MongoDB,在Spring Boot Repository中,我用这个注释注释了一个文档类:

@Indexed(name = "deleteAt", expireAfterSeconds = 0)
private LocalDateTime deleteAt;

正如我从文档here中读到的那样,文档应该会在指定的DateTime处自动删除。它主要起作用,但是当我经常轮询相同的文档时,我看到删除的延迟。大多数文档都被立即删除,但有些文档在指定的删除时间后仍然在数据库中保留最多30秒。

这让我想知道MongoDB是否运行调度程序来清理这些文件,如果是这样,它运行的频率是多少?

1 个答案:

答案 0 :(得分:5)

Spring Data的expireAfterSeconds属性使用MongoDB TTL索引,并且the docs中描述了TTL索引的expireAfterSeconds属性的行为,如下所示:

  

当您在后台构建TTL索引时,TTL线程可以在索引构建时开始删除文档。如果您在前台构建TTL索引,MongoDB会在索引完成构建后立即删除过期的文档。

     

TTL索引不保证过期时将立即删除过期数据。文档到期的时间与MongoDB从数据库中删除文档的时间之间可能会有延迟。

     

删除过期文档的后台任务每60秒运行一次。因此,在文档到期和运行后台任务之间的时间段内,文档可能会保留在集合中。

     

由于删除操作的持续时间取决于您的mongod实例的工作负载,因此在运行后台任务之间的60秒之后的某段时间内,过期数据可能会存在。

所以,答案是: 60秒虽然过期的数据可能存活超过60秒,因为“删除操作的持续时间取决于您的mongod实例的工作负载......”。 / p>