AzureDocumentDB MongoDB 协议支持:无法创建 TTL 索引

AzureDocumentDB MongoDB protocol support: Failing to create TTL index

我目前正在使用 Spring 数据 MongoDB 来抽象 MongoDB 操作,并使用具有 MongoDB 协议支持的 Azure DocumentDB 数据库。我还 运行 使用最新的 MongoDB Java 驱动程序本身。

在此过程中设置 TTL 索引存在问题。

我收到以下异常。

`Caused by: com.mongodb.CommandFailureException: { "serverUsed" : "****-****-test.documents.azure.com:****" , "_t" : "OKMongoResponse" , "ok" : 0 , "code" : 2 , "errmsg" : "The 'expireAfterSeconds' option has invalid value. Ensure to provide a nonzero positive integer, or '-1'` which means never expire." , "$err" : "The 'expireAfterSeconds' option has invalid value. Ensure to provide a nonzero positive integer, or '-1' which means never expire."}
at com.mongodb.CommandResult.getException(CommandResult.java:76)
at com.mongodb.CommandResult.throwOnError(CommandResult.java:140)
at com.mongodb.DBCollectionImpl.createIndex(DBCollectionImpl.java:399)
at com.mongodb.DBCollection.createIndex(DBCollection.java:597)

这是我正在使用的 POJO 的简单表示。

public class Train{
   @JsonProperty
   private String id;

   @JsonProperty("last_updated")
   @Indexed(expireAfterSeconds = 1)
   private Date lastUpdated;

   // Getters & Setters
   .
   .
   .
}

这是我初始化索引的初始方法(通过@Indexed 注释)。

我还尝试通过以下方式初始化索引:

mongoTemplate.indexOps(collection.getName())
                .ensureIndex(new Index("last_updated", Sort.Direction.DESC)
                .expire(1, TimeUnit.SECONDS));

两种设置索引的方法都会抛出相同的异常。

我还看到一条错误消息,指出它只能在“_ts”字段上完成。我认为这是由于 Azure DocumentDB 将“_ts”字段用于它自己的 TTL 操作。所以我尝试了以下相同的结果:

我是这些技术的新手(DocumentDB 和 MongoDB),所以我可能遗漏了一些明显的东西。

有什么想法吗?

根据官方教程的博客DocumentDB now supports Time-To-Live (TTL) & the section Setting TTL on a document,根据生存时间自动过期 DocumentDB 集合中的数据,Azure DocumentDB 上的 TTL 设置与 MongoDB 不同,尽管 Azure支持通过 MongoDB drive & spring-data in Java.

在 DocumentDB 上执行操作

TTL 应在 DocumentDB 上定义为 属性 以设置非零正整数值,因此请尝试如下更改代码。

public class Train{
   @JsonProperty
   private String id;

   @JsonProperty("last_updated")
   private Date lastUpdated;

   /*
    * Define a property as ttl and set the default value 1.
    */
   @JsonProperty("ttl")
   private int expireAfterSeconds = 1;

   // Getters & Setters
   .
   .
   .
}

希望对您有所帮助。如有任何疑问,请随时告诉我。


更新: 请注意 https://docs.microsoft.com/en-us/azure/documentdb/documentdb-time-to-live#configuring-ttl.

处的以下内容

By default, time to live is disabled by default in all DocumentDB collections and on all documents.

所以请先在 Azure portal 上启用 TIME TO LIVE 功能,如下图,或者按照上面的 link 以编程方式启用它。

重新审视我前一段时间发布的问题,以回复我想出的解决方案。

请注意,自从我发布此问题后,DocumentDB 已重命名为 CosmosDB。

Spring 框架或 CosmosDB/DocumentDB 平台端存在类型转换问题。尽管文档说它需要一个整数,但实际上您需要传递一个双精度值。

我正在使用以下内容并且它有效

dcoll.createIndex(new BasicDBObject("_ts", 1)
                    , new BasicDBObject("expireAfterSeconds", 10.0));