2016-01-15 2 views
0

Я работаю с документами, убирающими документы из коллекции. Приложение java создает индекс для документов Mongo TTL.Mongo TTL не снимает документы

coll.createIndex(new Document("Expires", 1).append("expireAfterSeconds", 0)); 

При вставке документа я установил Expires поле для будущего Date. Для этого тестирования я настраивал его на 1 минуту в будущем.

Я проверял, что дата существует правильно, индекс выглядит правильно, и я ждал 10+ минут (хотя бегун ttl работает каждые шестьдесят секунд), но документ остается.

{ 
    "_id" : ObjectId("569847baf7794c44b8f2f17b"), 
    // my data 
    "Created" : ISODate("2016-01-15T02:02:30.116Z"), 
    "Expires" : ISODate("2016-01-15T02:03:30.922Z") 
} 

Что еще я мог пропустить? Вот индексы:

[ 
    { 
     "v" : 1, 
     "key" : { 
      "_id" : 1 
     }, 
     "name" : "_id_", 
     "ns" : "prism.prismEventRecord" 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "Location.X" : 1, 
      "Location.Z" : 1, 
      "Location.Y" : 1, 
      "Created" : -1 
     }, 
     "name" : "Location.X_1_Location.Z_1_Location.Y_1_Created_-1", 
     "ns" : "prism.prismEventRecord" 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "Created" : -1, 
      "EventName" : 1 
     }, 
     "name" : "Created_-1_EventName_1", 
     "ns" : "prism.prismEventRecord" 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "Expires" : 1, 
      "expireAfterSeconds" : 0 
     }, 
     "name" : "Expires_1_expireAfterSeconds_0", 
     "ns" : "prism.prismEventRecord" 
    } 
] 
+0

Можете ли вы показать нам содержание db.coll.getIndexes() из оболочки? Просто хочу подтвердить, что индексы делают все в порядке. – bri

+0

Добавил результаты на мой вопрос – helion3

ответ

1

Интересно, если это имеет смысл взять клиент Java Монго из ПОС в течение минуты.

Я создал подобную коллекцию и сделал следующий вызов в оболочке.

db.weblog.createIndex({"expireAt":1},{expireAfterSeconds:0}) 

Когда я делаю, и тогда я называю db.weblog.getIndexes(), это то, что истекающий индекс выглядит следующим образом:

{ 
    "v" : 1, 
    "key" : { 
     "expireAt" : 1 
    }, 
    "name" : "expireAt_1", 
    "ns" : "logs.weblog", 
    "expireAfterSeconds" : 0 
} 

Я думаю, что ваш Java вызов может быть «добавление» новый столбец для вашего индекса (не устанавливая свойство, которое вы надеялись установить). Посмотрите ... Ваш индекс четкости выглядит следующим образом:

{ 
    "v" : 1, 
    "key" : { 
     "Expires" : 1, 
     "expireAfterSeconds" : 0 
    }, 
    "name" : "Expires_1_expireAfterSeconds_0", 
    "ns" : "prism.prismEventRecord" 
} 

Посмотрите, что я имею в виду? «expireAfterSeconds - это ключ, а не свойство. Теперь - как вы это делаете с оболочкой java? Ummm ... не кричите на меня, но Im aC# guy ... Я нашел сообщение или два что punt on the question of ttl indexes from the java client, но они старые-ish.

Может быть, клиент java стал лучше и теперь поддерживает варианты? Надеюсь, зная, в чем проблема, дает человеку с вашими навыками звездного кодирования достаточно, чтобы взять его отсюда;)

EDIT: Stack код драйвера Java (непроверенные):

IndexOptions options = new IndexOptions() 
    .name('whocareswhatwecallthisindex') 
    .expireAfter(1, TimeUnit.DAYS); 
coll.createIndex(new Document("Expires", 1), options); 

EDIT2: C# код драйвера, чтобы создать один и тот же индекс:

var optionsIdx = new CreateIndexOptions() { ExpireAfter = new TimeSpan(0)}; 
await coll.Indexes.CreateOneAsync(Builders<MyObject>.IndexKeys.Ascending("expiresAt"), optionsIdx); 
+0

Я еще не смог протестировать, но у меня есть чувство, что вы правы - это, вероятно, проблема с методом '.append', используемым в объекте' Document'. Вместо добавления я должен, вероятно, предоставить два полностью отдельных документа. Я уверен, что все. – helion3

+0

Да. Проверьте класс индексов, который также работает в java-клиенте (код добавлен в конце ответа). C# работает, но я не смог проверить Java-код. – bri

+0

Yup, все. благодаря – helion3

Смежные вопросы