2017-02-08 10 views
1

В настоящее время я использую Spring Data MongoDB для абстрагирования операций MongoDB и использования базы данных Azure DocumentDB с поддержкой протокола MongoDB. Я также столкнулся с этим, используя последний драйвер Java MongoDB.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-операции. Поэтому я пробовал использовать следующие результаты с такими же результатами:

  • Добавлено новое поле, длинное '_ts', в pojo и попыталось с аннотацией.
  • Попытка установить индекс с помощью метода sureIndex с полем «_ts».
  • Сделал то же самое, но изменил тип '_ts' на Date.

Я новичок в этих технологиях (DocumentDB и MongoDB), поэтому мне, вероятно, не хватает чего-то очевидного.

Любые мысли?

ответ

1

Перепосещение мой вопрос, который я отправил некоторое время назад, чтобы ответить с решением, которое я разобрался.

Обратите внимание, что DocumentDB был переименован в CosmosDB, так как я разместил этот вопрос.

Возникла проблема с литьем типов либо в платформе Spring, либо на стороне платформы CosmosDB/DocumentDB. Несмотря на то, что документация говорит, что ей нужно целое число, вам действительно нужно передать ей двойное значение.

Я использую что-то вдоль линий следующее, и она работает

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

Согласно блога DocumentDB now supports Time-To-Live (TTL) & раздел Setting TTL on a document в OFFICAL учебнике Expire данных в коллекциях DocumentDB автоматически с течением времени, чтобы жить, установка на Лазурном DocumentDB TTL отличается от MongoDB, хотя Azure поддержка делать operater на DocumentDB с помощью MongoDB привода & 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 
    . 
    . 
    . 
} 

Надеюсь, это поможет. Любое беспокойство, пожалуйста, не стесняйтесь, дайте мне знать.


Update: Обратите внимание на содержание ниже в https://docs.microsoft.com/en-us/azure/documentdb/documentdb-time-to-live#configuring-ttl.

По умолчанию время жизни отключено по умолчанию во всех коллекциях DocumentDB и на всех документах.

Итак, сначала включите функцию TIME TO LIVE на портале Azure, как показано на рисунке ниже, или следуйте приведенной выше ссылке, чтобы включить ее программно.

enter image description here

+0

Я попытался это и не кости. Я также попробовал просто установить свойство private private ttl = 1. Пробовал комбинировать с параметрами индексирования манго. Не видя каких-либо поднятых исключений без установки индексов mongo, но функция ttl тоже не работает. –

+1

Этот параметр, похоже, недоступен на поддерживаемой MongoDB db. У меня 2 дБ в моей учетной записи, с одной поддержкой Mongo, и без нее. Я вижу параметр TTL для базы данных, не поддерживающей протокол Mongo, но не для включенного. –