TTL을 설정하여 컬렉션에서 데이터 만료하기
이 문서는 MongoDB의 "time to live" 또는 TTL 컬렉션 기능에 대한 소개를 제공합니다. TTL 컬렉션을 사용하면 MongoDB에 데이터를 저장하고, 지정된 초 또는 특정 시간 이후에 mongod
가 데이터를 자동으로 제거할 수 있습니다.
다음 환경에서 호스팅되는 배포에 대한 데이터를 쿼리할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
데이터 만료는 제한된 기간 동안만 지속되면 되는 시스템 생성 이벤트 데이터, 로그 및 세션 정보를 비롯한 일부 정보 클래스에 유용합니다.
특수 TTL 인덱스 속성은 TTL 컬렉션의 구현을 지원합니다. TTL 기능은 인덱스에서 날짜가 입력된 값을 읽고 컬렉션에서 만료된 문서를 mongod
제거하는 의 백그라운드 스레드에 의존합니다.
TTL 인덱스를 생성하려면 createIndex()
사용하세요. 날짜 유형 또는 날짜 유형 값을 포함하는 배열인 인덱스 필드를 지정합니다. 옵션을 사용하여 TTL 값을 초 단위로 지정합니다.expireAfterSeconds
참고
TTL 인덱스는 단일 필드 인덱스입니다. 복합 인덱스는 TTL 속성을 지원하지 않습니다. TTL 인덱스에 대한 자세한 내용은 TTL 인덱스를 참조하십시오.
3} 명령을 collMod
사용하여 기존 TTL 인덱스의 을 수정할 수 있습니다.expireAfterSeconds
시계열 컬렉션에 1970-01-01T00:00:00.000Z
이전 또는 2038-01-19T03:14:07.000Z
이후에 timeField
타임스탬프가 있는 문서가 포함된 경우 TTL " time to live " 기능을 사용하여 컬렉션에서 문서를 삭제하지 않습니다.
MongoDB Atlas UI에 문서 삽입
Atlas UI에서 데이터를 만료하려면 다음 단계를 따르세요:
MongoDB Atlas UI에서 프로젝트의 Clusters 페이지로 이동합니다.
아직 표시되지 않은 경우 탐색 표시줄의 Organizations 메뉴에서 원하는 프로젝트가 포함된 조직을 선택합니다.
아직 표시되지 않은 경우 내비게이션 바의 Projects 메뉴에서 프로젝트를 선택합니다.
아직 표시되지 않은 경우 사이드바에서 Clusters를 클릭합니다.
Clusters(클러스터) 페이지가 표시됩니다.
expiresAfter
필드가 포함된 문서를 컬렉션에 추가
왼쪽 탐색 창에서 인덱스가 포함된 컬렉션을 선택합니다.
Find 탭을 클릭합니다.
Insert Document를 클릭합니다.
0} 필드 아래의 텍스트 필드를 클릭하고 _id 필드 이름 을 입력합니다.
expiresAfter
0} 옆의 텍스트 필드를
expiresAfter
클릭하고 다음 값을 입력합니다.2023-10-01T12:00:00.000+00:00 이 값은 2023년 10월 1일 12시 이후 데이터가 만료됩니다.
데이터 유형 드롭다운 메뉴를 클릭하고 데이터 유형 값을 Date으로 변경합니다.
Insert를 클릭합니다.
문서가
expiredAfter
필드 값에서 1초 후에 자동으로 만료됩니다.TTL 인덱스는 문서가 만료되는 데 1~2초 정도 걸릴 수 있습니다. MongoDB Atlas가 만료된 문서를 삭제하는지 확인하려면 UI를 새로 고쳐야 할 수도 있습니다.
지정된 시간(초) 후 문서 만료
터미널에서 지정된 시간(초)이 지나면 데이터가 만료될 수 있습니다. 인덱싱된 필드에서 지정된 시간(초)이 경과한 후 데이터를 만료하려면 BSON 날짜 유형의 값 또는 BSON 날짜 유형의 객체 배열이 있는 필드에 TTL 인덱스를 만들고 expireAfterSeconds
필드에 0이 아닌 양수 값을 지정합니다. 색인화된 필드에 지정된 시간 이후 expireAfterSeconds
필드의 시간(초)이 지나면 문서가 만료됩니다. [1]
TTL 인덱스 expireAfterSeconds
값은 0
과 2147483647
사이여야 합니다.
예를 들어 다음 작업은 log_events
컬렉션의 createdAt
필드에 인덱스를 만들고 10
의 expireAfterSeconds
값을 지정하여 만료 시간을 createdAt
에서 지정한 시간 10초 후로 설정합니다.
db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 10 } )
0}log_events
컬렉션에 문서를 추가할 때 createdAt
필드를 현재 시간으로 설정합니다:
db.log_events.insertOne( { "createdAt": new Date(), "logEvent": 2, "logMessage": "Success!" } )
문서의 createdAt
값 [1 ]이 expireAfterSeconds
에 지정된 시간(초)보다 오래되면 MongoDB는 log_events
컬렉션에서 문서를 자동으로 삭제합니다.
[1] | (1, 2) 필드에 BSON 날짜 형식의 객체 배열이 포함된 경우, BSON 날짜 형식의 객체 중 하나 이상이 expireAfterSeconds 에 지정된 시간(초)보다 오래된 경우 데이터가 만료됩니다. |
필터 조건으로 문서 만료
특정 필터 표현식으로 문서를 만료하려면 부분 인덱스와 TTL 인덱스를 모두 생성할 수 있습니다.
부분 TTL 인덱스를 생성합니다:
db.foo.createIndex( { F: 1 }, { name: "Partial-TTL-Index", partialFilterExpression: { D : 1 }, expireAfterSeconds: 10 } )
1}의 필터 표현식 과 일치하는 문서 두 개를 { D : 1 }
partialFilterExpression
삽입합니다:
db.foo.insertMany( [ { "F" : ISODate("2019-03-07T20:59:18.428Z"), "D" : 3}, { "F" : ISODate("2019-03-07T20:59:18.428Z"), "D" : 1} ] )
10초 동안 기다린 다음 foo
컬렉션을 쿼리합니다:
db.foo.find({}, {_id: 0, F: 1, D: 1})
{ D : 1 }
의 partialFilterExpression
과(와) 일치하는 문서가 삭제(만료)되었습니다. 결과적으로 foo
컬렉션에 문서가 하나만 남게 됩니다:
{ "F" : ISODate("2019-03-07T20:59:18.428Z"), "D" : 3}
특정 시계 시간에 문서 만료하기
터미널에서 지정된 시계 시간에 데이터를 만료할 수 있습니다. 특정 시계 시간에 문서를 만료하려면 먼저 BSON 날짜 유형의 값 또는 BSON 날짜 유형 객체의 배열을 포함하는 필드에 TTL 인덱스를 만들고 expireAfterSeconds
값을 0
로 지정합니다. 컬렉션의 각 문서에 대해 인덱싱된 날짜 필드를 문서가 만료되어야 하는 시간에 해당하는 값으로 설정합니다. 인덱싱된 날짜 필드에 과거 날짜가 포함되어 있는 경우, MongoDB는 문서가 만료된 것으로 간주합니다.
예를 들어, 다음 작업은 log_events
컬렉션의 expireAt
필드에 인덱스를 만들고 0
expireAfterSeconds
값을 지정합니다.
db.log_events.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )
각 문서에 대해 문서가 만료되어야 하는 시간에 해당하도록 expireAt
값을 설정합니다. 예를 들어, 다음 insertOne()
작업은 July 22, 2013 14:00:00
에 만료되는 문서를 추가합니다.
db.log_events.insertOne( { "expireAt": new Date('July 22, 2013 14:00:00'), "logEvent": 2, "logMessage": "Success!" } )
MongoDB는 문서의 expireAt
값이 expireAfterSeconds
지정된 시간 (예: 0
초) 보다 오래된 경우 log_events
컬렉션에서 문서를 자동으로 삭제합니다. 따라서 데이터는 지정된 expireAt
값에서 만료됩니다.
NaN을 사용하여 인덱스 구성
경고
데이터 손실 가능성
TTL 인덱스가 으로 설정된 expireAfterSeconds
NaN
경우 업그레이드, 다운그레이드 및 특정 동기화 작업으로 인해 예기치 않은 동작이 발생하고 데이터가 손실될 수 있습니다.
TTL 인덱스 구성에서 expireAfterSeconds
을 NaN
로 설정하지 마십시오.
MongoDB 5.0 이전 버전에서는 TTL 인덱스에 expireAfterSeconds
이 NaN
로 설정된 경우, MongoDB는 오류를 기록하고 레코드를 제거하지 않습니다.
MongoDB 5.0.0 - 5.0.13(및 6.0.0 - 6.0.1)에서, NaN
은 0
로 취급됩니다. TTL 인덱스가 로 구성되어 로 설정된 expireAfterSeconds
NaN
경우 모든 TTL 인덱스 문서가 즉시 만료됩니다.
MongoDB 5.0.14 (및 6.0.2) 부터 서버는 expireAfterSeconds
가 NaN
로 설정된 TTL 인덱스를 사용하지 않습니다.
그러나 여전히 예기치 않은 동작이 발생할 수 있는 몇 가지 상황이 있습니다. 문서가 만료될 수 있습니다:
MongoDB 5.0.0 - 5.0.13(또는 6.0.0 - 6.0.1)에서 이전 버전으로 처음 동기화하는 중입니다.
이전 버전에서 MongoDB 5.0.0 - 5.0.13으로 업그레이드하는 경우.
5.0 이전 버전에서 컬렉션을 복원하는 경우
mongodump
를 MongoDB 5.0.0 - 5 로 변환합니다.0.13 (또는 6.0.0 - 6.0.1) 인스턴스.
문제를 방지하려면 잘못 구성된 TTL 인덱스를 제거하거나 수정하세요.
잘못 구성된 인덱스를 식별합니다.
셸에서 mongosh
다음 스크립트를 실행합니다. 스크립트가 레거시 mongo
셸에서 작동하지 않습니다.
function getNaNIndexes() { const nan_index = []; const dbs = db.adminCommand({ listDatabases: 1 }).databases; dbs.forEach((d) => { if (d.name != 'local') { const listCollCursor = db .getSiblingDB(d.name) .runCommand({ listCollections: 1 }).cursor; const collDetails = { db: listCollCursor.ns.split(".$cmd")[0], colls: listCollCursor.firstBatch.map((c) => c.name), }; collDetails.colls.forEach((c) => db .getSiblingDB(collDetails.db) .getCollection(c) .getIndexes() .forEach((entry) => { if (Object.is(entry.expireAfterSeconds, NaN)) { nan_index.push({ ns: `${collDetails.db}.${c}`, index: entry }); } }) ); } }); return nan_index; }; getNaNIndexes();
잘못 구성된 인덱스를 수정합니다.
2}collMod
명령을 사용하여 스크립트에서 발견한 잘못 구성된 expireAfterSeconds
값을 업데이트합니다.
또는 잘못 구성된 TTL 인덱스를 drop
삭제하고 나중에 createIndexes
명령을 사용하여 다시 만들 수 있습니다.