我目前正在使用Spring Data 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));
设置索引的两种方式都抛出相同的execption。
我也看到一个错误,说它只能在' _ts'领域。我认为这是由于Azure DocumentDB使用了' _ts'它自己的TTL操作领域。所以我尝试了以下相同的结果:
我是这些技术的新手(DocumentDB和MongoDB),所以我可能遗漏了一些明显的东西。
有什么想法吗?
答案 0 :(得分:1)
重新审视我的问题,我已经发布了一段时间回复了我想出的解决方案。
请注意,自从我发布此问题以来,DocumentDB已重命名为CosmosDB。
在Spring框架或CosmosDB / DocumentDB平台方面存在类型转换问题。尽管文档说它需要一个整数,但实际上你需要传递一个双精度值。
我正在使用下面的内容,它可以正常工作
dcoll.createIndex(new BasicDBObject("_ts", 1)
, new BasicDBObject("expireAfterSeconds", 10.0));
答案 1 :(得分:-1)
根据博客DocumentDB now supports Time-To-Live (TTL)&在官方教程的Setting TTL on a document部分自动将DocumentDB集合中的数据过期并且生存时间,Azure DocumentDB上的TTL
设置与MongoDB不同,尽管Azure支持通过MongoDB驱动器在DocumentDB上执行操作。 Java中的spring-data
。
应将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。
默认情况下,默认情况下,所有DocumentDB集合和所有文档都会禁用生存时间。
因此,请首先在Azure门户上启用功能TIME TO LIVE
,如下图所示,或者按照上面的链接以编程方式启用它。