使用expireAfterSeconds索引的Spring Boot MongoDB自动删除文档不起作用

时间:2018-05-25 16:08:10

标签: spring mongodb spring-boot spring-mongodb mongodb-indexes

我的生活时间有问题" MongoDB中的设置。我在我的实体中的Spring-Boot 2.0.2.RELEASE项目中创建了一个索引注释,该项目代表MongoDB中的Document。我设置了" expireAfterSeconds"测试为15秒,但MongoDB在15秒后没有删除插入的文档。有人能告诉我我做错了吗?

这是作为JSON的MongoDB索引:

[
  2,
  {
    "createdDateTime" : 1
  },
  "deleteAt",
  "AccountServiceDB.AccountRegistration",
  NumberLong(15)
]

这是我的实体:

@Document(collection = "AccountRegistration")
public class UserRegistration {

  @Id
  private ObjectId _id;
  @Indexed(unique = true)
  private String username;

  @Indexed(unique = true)
  private String email;

  private String user_password;

  @Indexed(name = "deleteAt", expireAfterSeconds = 15)
  private Date createdDateTime;

  public UserRegistration() {}

  public ObjectId get_id() {
    return _id;
  }

  public void set_id(ObjectId _id) {
    this._id = _id;
  }
}

2 个答案:

答案 0 :(得分:0)

首先检查索引是否正确创建。使用 mongo-shell,您可以执行 db.collection.getIndexes(),它应该沿着 TTL 索引返回给定集合的索引,例如

[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "sample.collectionsName"
    },
    {
        "v" : 2,
        "key" : {
            "dateField" : 1
        },
        "name" : "dateField",
        "ns" : "sample.collectionname",
        "expireAfterSeconds" : NumberLong(5)
    }
]

如果这不起作用,您需要使用

启用索引创建
      auto-index-creation: true

完成所有这些设置后,您应该会看到您的文档确实被删除了,但是请考虑 mongod-ttl 工作。此作业每 60 秒运行一次,这意味着具有 TTL 索引的文档最初可能会错过第一次清理运行,并且需要 +60 秒才能删除。

这在 JJussi 固定的文档中也得到了完美的描述。

TTL Indexes - MongoDB

答案 1 :(得分:-1)

Here是解释:"删除过期文档的后台任务每60秒运行一次。因此,在文档到期和运行后台任务之间的期间,文档可能会保留在集合中。"