我目前正在使用 Spring Data MongoDB 来抽象 MongoDB 操作,并使用支持 MongoDB 协议(protocol)的 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 操作。所以我尝试了以下方法,得到了相同的结果:
- 向 pojo 添加了一个新字段 Long '_ts',并尝试使用注释。
- 尝试通过 EnsureIndex 方法和“_ts”字段设置索引。
- 执行与上述相同的操作,但将“_ts”的类型更改为 Date。
我对这些技术(DocumentDB 和 MongoDB)很陌生,所以我可能错过了一些明显的东西。
有什么想法吗?
最佳答案
重新审视我不久前发布的问题,以我找到的解决方案进行回复。
请注意,自从我发布此问题以来,DocumentDB 已重命名为 CosmosDB。
Spring 框架或 CosmosDB/DocumentDB 平台端的类型转换存在问题。尽管文档说它需要一个整数,但实际上您需要向它传递一个 double 值。
我正在使用以下内容并且它有效
dcoll.createIndex(new BasicDBObject("_ts", 1)
, new BasicDBObject("expireAfterSeconds", 10.0));
关于java - AzureDocumentDB MongoDB协议(protocol)支持: Failing to create TTL index,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42121363/