2014-09-24 6 views
1

Mongo 2.4.10에서 TTL 색인을 사용하고 있지만 더 이상 작동하지 않습니다.mongodb background 문서를 제거하지 않는 TTL

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

그러나 하나의 findOne() 나에게 오래된 문서를 보여줍니다 예를 들어, 하나 개의 컬렉션, 나는 우리가 db.collectionName.getIndexes()로 볼 수 오일 (432,000초)로 설정 한 예상보다 :

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

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

모든

은 최근까지 잘 작동하는 것 같았다 : 우리가 생산 전에 그것을 알아 차리지 않았다

"_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") 

의 TTL 인덱스를 작성하는 자바 코드는 다음과 같다. 이것은 모든 데이터베이스와 모든 관련 컬렉션에서 발생합니다.

무엇이 잘못 되었나요?


편집 : 내 서버 구성을 확인했습니다

, TTL 모니터가 활성화됩니다 : 당신은 인덱스 대신의 backgroundexpireAfterSeconds 등의 추가 필드를 추가하는

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

답변

3

인덱스 옵션으로. ensureIndex에 두 번째 DBObject 매개 변수들을 넣어 : 당신은 당신이 그것을 다시 추가하기 전에 수동으로 먼저 기존 인덱스를 삭제해야합니다

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); 

참고.

관련 문제