2014-01-05 3 views
4

내 세션에 AdministratorSession 콜렉션을 사용 중입니다. 그가 "Remember Me"를 클릭하면 세션 문서가 3600 분 후에 삭제되고, 그렇지 않으면 30 분 후에 삭제됩니다. 가능한가? 그렇지 않다면 내 선택권은 무엇입니까?동일한 컬렉션에있는 여러 문서의 TTL이 다릅니 까?

나는 여기서 간단한 접근법을 사용해 보았지만 색인을 생성하고 생성 된 첫 번째 문서에 TTL 값을 설정합니다. 예를 들어, 한 문서 ttl이 30으로 설정되고 3600 옆에 있으면 둘 다 30 분 후에 삭제됩니다.

다음은 현재이 기능을 수행하는 방법입니다. 이 작은 (if document.date < (now() - TTLduration)) delete(document);) 때

public AdministratorSession Add(string ip, bool remember) 
{ 
    var random = new Random(); 

    var session = new AdministratorSession 
    { 
     StartDateTime = DateTime.Now, 
     Hash = EncryptionService.Sha256(DateTime.Now.Ticks.ToString(CultureInfo.InvariantCulture)), 
     Salt = EncryptionService.Md5(ip + random.Next(0, 1000)) 
    }; 

    var db = DbContext.GetDatabase(); 
    var collection = db.GetCollection<AdministratorSession>("AdministratorSession"); 

    collection.EnsureIndex(IndexKeys.Ascending("StartDateTime"), IndexOptions.SetTimeToLive(TimeSpan.FromMinutes(remember ? 36000 : 30))); 
    collection.Insert(session); 

    return session; 
} 

답변

6

MongoDBs TTL 알고리즘은 현재 날짜를 뺀 TTL 인덱스의 시간과 색인 날짜 필드를 비교하고 문서를 삭제하여 작동합니다.

date-field를 현재 시간으로 설정하고 삭제할 때까지의 TTL 시간을 설정하는 대신에 다른 방법으로 메커니즘을 사용할 수도 있습니다. TTL 시간을 0으로 설정하고 날짜 필드를 문서를 삭제하고자하는 날짜.

+0

좋은 생각, 지금 시험해 보겠습니다. – sed

+0

좋은 해결 방법 – i3arnon

관련 문제