2017-12-13 5 views
0

캐시로 MongoDB (v3.4)를 사용하고 TTL 인덱스를 사용하여 레코드를 만료합니다. 그러나 TTL 설정이 제대로 작동하지 않는 것 같습니다. 특히, 데이터를 삽입하기 위해 엔드 포인트를 사용하여 테스트했습니다 (아래 참조).NodeJS에서 MongoDB TTL 만료가 올바르게 작동하지 않습니다.

끝점 mongoInsert는 5 분 내에 만료됩니다. 그러나 ~ 1 분 후에 문서가 삭제 된 것으로 보입니다. 나는 moment(). utc(). toDate()를 사용하여 UTC 시간 사용에 관한 다른 유사한 제안을 찾아 보았고 그 행동은 동일했다. 새로운 Date()가 UTC 시간을 반환하므로 같은 효과가 있어야합니다.

포함되어야하지만 설명서에 자세히 설명되어 있지 않은 다른 설정이 있는지 확실하지 않습니다. 누구든지 전에 이것을 경험 했습니까?

function mongoInsert(mongoClient){ 
    return function(req, res){ 
     mongoClient.connect('mongodb://localhost:27017/cache', function(err, db) { 
      db.collection('data', function(err, collection){ 
       var testItems = [{ 
        "_id": "abc12345", 
        "dmac": "abc", 
        "createdAt": new Date(), 
        "val": { 
         "0": 10, 
         "1": 15, 
         "2": 5 
        }, 
        "res": "minutes", 
        "time": "2017-12-04T00:12:58Z" 
       }]; 
       let unix = new moment().valueOf(); 
       collection.createIndex({createdAt: unix}, {expireAfterSeconds: 300}); 
       collection.insertMany(testItems, function(err, items){ 
        db.close(); 
        res.json(items); 
       }); 
      }) 
     }) 
    } 
} 
+0

여기에서 MongoDB 버전을 언급하십시오. –

+0

Mongo 버전 3.4를 사용하고 있습니다. – jlyh

+0

mongoose.js를 사용하고 있습니까? –

답변

1
collection.createIndex({createdAt: 1}, {expireAfterSeconds: 60,unique:true}); 

collection.createIndex({createdAt: 1}, {expireAfterSeconds: 300,unique:true}); 

이 유효하지 않습니다

당신은() 기존 인덱스의 expireAfterSeconds의 값을 변경 createIndex을 사용할 수 없습니다. 대신 색인 콜렉션 플래그와 함 2 collMod database 명령을 사용하십시오. 그렇지 않으면 기존 인덱스의 옵션 값을 변경하려면 먼저 인덱스를 삭제하고 다시 작성해야합니다. groups.google.com/forum/# ​​: 개별 문서의 만료를 들어

https://docs.mongodb.com/v3.4/core/index-ttl/, 그것은 단지 만료 시간을 계산하고 특정 시계 시간 (심판에 의해 그들을 만료하여 수행 할 수 있다는보고가있다! 주제/mongodb-dev/ZLb8KSrLyOo).

var testItems = [{ 
    "_id": "abc12345", 
    "dmac": "abc", 
    "expireAt": moment().add(3, 'minutes').toDate(), 
    "val": { 
     "0": 10, 
     "1": 15, 
     "2": 5 
    }, 
    "res": "minutes", 
    "time": "2017-12-04T00:12:58Z" 
}]; 
let unix = new moment().valueOf(); 
collection.createIndex({expireAt: unix}, {expireAfterSeconds: 0}, function(error, indexName){ 
    if(error) console.log(error); 
    console.log(indexName); 
}); 
+0

값을 변경하려고하지 않습니다. 기존 색인의 expireAfterSeconds. TTL 집합에 따라 서로 다른 만료 시간에 둘 다 떨어 뜨린 기능을 테스트하려고합니다. 그대로, mongoDB는 300 초의 설정 시간보다 일찍 내 기록을 삭제합니다. – jlyh

+0

동일한 "createdAt"키에서 createIndex()를 두 번 사용하십시오 – Shubham

+0

그 점을 지적 해 주셔서 감사합니다. 나는 이미 변화를 만들었지 만 그것을 (고유 한) 유닉스 타임 스탬프로 변경 한 후에도 여전히 (초기 만기) 같은 행동을 보여주고있다. – jlyh

관련 문제