MongoDB多久检查一次其索引“ expireAfterSeconds”?

use*_*453 3 java mongodb spring-data-mongodb

我在本地使用一个单一实例MongoDB,并在Spring Boot存储库中,使用以下注释对文档类进行注释:

@Indexed(name = "deleteAt", expireAfterSeconds = 0)
private LocalDateTime deleteAt;
Run Code Online (Sandbox Code Playgroud)

正如我从此处的文档中读取的那样,文档应在指定的位置自动删除DateTime。它通常可以正常工作,但是当我频繁轮询同一文档时,我看到删除操作有所延迟。大多数文档被立即删除,但是在指定的删除时间之后,有些文档仍保留在数据库中长达30秒。

这让我想知道MongoDB是否运行调度程序来清理此类文档,如果可以的话,它多久运行一次?

gly*_*ing 6

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

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

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

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

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

因此,答案是:尽管过期数据的生存时间可能超过60s,但仍为60秒,因为“删除操作的持续时间取决于mongod实例的工作量...”。