MongoDB(TTL 인덱스)로 만료된 문서를 자동으로 삭제

4865 단어 databasemongodb
최근에 시간이 지나면 MongoDB에 저장한 일부 문서를 삭제해야 했습니다. 일정 시간 후에 데이터를 삭제하려는 몇 가지 예를 생각할 수 있습니다.
  • 로그/이벤트
  • API 키/액세스 토큰
  • 비활성 사용자

  • 데이터를 삭제하는 cronjob을 실행하여 새 데이터를 삽입하거나 다른 솔루션을 삽입할 때마다 데이터를 삭제할 수 있습니다.

    운 좋게도 제 아내는 MongoDB에 이미 그 메커니즘이 내장되어 있다고 말했습니다.

    TTL 인덱스



    TTL(Time-To-Live) 인덱스는 MongoDB가 일정 시간 후 컬렉션에서 문서를 자동으로 제거하는 데 사용할 수 있는 특수한 단일 필드 인덱스입니다.

    mongod의 백그라운드 스레드는 인덱스의 값을 읽고 컬렉션에서 만료된 문서를 제거합니다(보통 1분마다).

    예를 들어 lastModifiedDate 컬렉션의 eventlog 필드에 TTL 인덱스를 생성하려면 mongo 셸에서 다음 작업을 사용합니다.

    db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
    


  • 인덱싱된 필드는 BSON date type 또는 BSON 날짜 배열
  • 이어야 합니다.
  • 문서의 인덱싱된 필드가 날짜 또는 날짜 값을 포함하는 배열이 아닌 경우 문서는 만료되지 않습니다.
  • 문서에 인덱싱된 필드가 없으면 문서가 만료되지 않습니다.

  • 조건부 삭제



    MongoDB 3.2부터 컬렉션은 지정된 필터 표현식 partialFilterExpression 을 사용하여 부분적으로 인덱싱될 수 있습니다. TTL 인덱스는 부분 인덱스와 함께 사용할 수도 있습니다.

    예를 들어:

    1시간 전에 생성된 문서를 삭제하고 해당 문서의 stateTMP입니다.

    db.eventlog.createIndex(
      { created_at: 1 },
      { expireAfterSeconds: 3600, partialFilterExpression: { state: 'TMP' } }
    );
    


    1일 전에 생성된 문서count5보다 낮은 문서를 삭제합니다.

    db.eventlog.createIndex(
      { created_at: 1 },
      { expireAfterSeconds: 86400, partialFilterExpression: { count: { $lt: 5 } } }
    );
    


    Additional info on partial indexes

    실제 사례



    최근에 앱 번들 크기를 모니터링하는 데 도움이 되는 무료 도구인 BundleMon 개발을 완료했습니다.

    BundleMon의 구성 요소 중 하나는 지점 간의 번들 크기를 비교하기 위해 이력 보고서를 저장하는 서비스이므로 PR BundleMon을 열면 현재 번들 크기 보고서와 함께 레코드를 저장합니다.

    보고서를 30일 이상 저장할 필요가 없으므로 TTL 인덱스를 추가했습니다.

    db.reports.createIndex(
      { creationDate: 1 },
      { expireAfterSeconds: 2592000, partialFilterExpression: { prNumber: { $exists: true } } }
    );
    

    좋은 웹페이지 즐겨찾기