2017-02-08 53 views
1

我目前使用Spring Data MongoDB来抽象MongoDB操作,并将Azure DocumentDB数据库与MongoDB协议支持结合使用。我也碰到过使用最新的MongoDB Java驱动程序本身。AzureDocumentDB MongoDB协议支持:未能创建TTL索引

在此过程中设置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操作。所以我尝试了以下相同的结果:

  • 向pojo添加了一个新字段Long'_ts',并使用注释进行尝试。
  • 试图使用'_ts'字段通过ensureIndex方法设置索引。
  • 做了上述相同的事情,但将'_ts'的类型更改为日期。

我不熟悉这些技术(DocumentDB和MongoDB),所以我可能会错过某些明显的东西。

有什么想法?

回答

1

重温我的问题我已经发布了一段时间回来与我想通了解决答复。

请注意,自发布此问题以来,DocumentDB已重命名为CosmosDB。

在Spring框架或CosmosDB/DocumentDB平台方面有类型转换的问题。尽管文档说它需要一个整数,但实际上需要传递一个double值。

我使用沿着以下线的东西和它的作品

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

按照博客DocumentDB now supports Time-To-Live (TTL) &的官方教程的部分Setting TTL on a document到期。DocumentDB收集的数据与生存时间自动,在Azure上DocumentDB的TTL设置是MongoDB的不同,虽然Azure支持通过MongoDB的驱动做DocumentDB的算子& spring-data在Java中。

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,如下图所示,或者按照上述链接以编程方式启用它。

enter image description here

+0

我尝试这一点,并没有骰子。我也试过设置'private int ttl = 1'属性。尝试与mongo索引选项结合使用。在没有设置mongo索引的情况下没有看到任何引发的异常,但ttl函数似乎也没有工作。 –

+1

该选项在MongoDB启用的数据库中似乎不可用。我的帐户设置中有2分贝,其中一个支持Mongo,另外一个没有。我看到非Mongo协议启用数据库的TTL选项,但不是启用的。 –