2014-09-24 4 views
1

Я использую TTL-индексы на Mongo 2.4.10, но он больше не работает. Например, на одной коллекции, я поставил его на 5 дней (432000 секунд), как мы можем видеть db.collectionName.getIndexes():mongodb background TTL не удаляет документы

{ 
      "v" : 1, 
      "key" : { 
        "date" : -1, 
        "background" : true, 
        "expireAfterSeconds" : 432000 
      }, 
      "ns" : "dbName.collectionName", 
      "name" : "date_-1_background__expireAfterSeconds_432000" 
    } 

Но один findOne() показывает мне старший документ чем ожидалось:

"_id" : ObjectId("53a058140cf25876d78f7d03"), 
    "_class" : 
    "productIds" : [ 
      NumberLong(1045), 
      NumberLong(1124), 
      NumberLong(1277), 
      NumberLong(800), 
      NumberLong(978) 
    ], 
    "userId" : NumberLong(214120), 
    "date" : ISODate("2014-06-16T11:45:21.341Z") 

Java-код для создания индекса TTL является следующее:

DBObject keys = new BasicDBObject(); 
    keys.put(fieldName, -1); 
    keys.put("background", true); 
    keys.put("expireAfterSeconds", ttlInSeconds); 

    database.getCollection(collectionName).ensureIndex(keys); 

Все казалось работать нормально до недавнего времени: мы не заметили его раньше в производстве. Это происходит во всех моих базах данных и во всех соответствующих коллекциях.

Что случилось?


EDIT:

Я проверил мою конфигурацию сервера, монитор TTL включено:

my_replicat:PRIMARY> db.adminCommand({getParameter:1, ttlMonitorEnabled:1 }) 
{ "ttlMonitorEnabled" : true, "ok" : 1 } 

ответ

3

Вы хотите добавить background и expireAfterSeconds в качестве дополнительных полей индекса вместо как параметры индекса. Помещенный те во втором DBObject параметра ensureIndex:

DBObject keys = new BasicDBObject(); 
keys.put(fieldName, -1); 

DBObject options = new BasicDBObject(); 
options.put("background", true); 
options.put("expireAfterSeconds", ttlInSeconds); 

database.getCollection(collectionName).ensureIndex(keys, options); 

Обратите внимание, что вам нужно вручную сбросить существующий индекс, прежде чем вы можете повторно добавить его.