2017-02-08 82 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選項,但不是啓用的。 –