문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

TTL을 설정하여 컬렉션에서 데이터 만료하기

이 페이지의 내용

  • MongoDB Atlas UI에 문서 삽입
  • 지정된 시간(초) 후 문서 만료
  • 필터 조건으로 문서 만료
  • 특정 시계 시간에 문서 만료하기
  • NaN을 사용하여 인덱스 구성

이 문서에서는 MongoDB의 "타임 투 라이브" 또는 TTL 수집 기능에 대해 소개합니다. TTL 컬렉션을 사용하면 MongoDB에 데이터를 저장하고 mongod 지정된 시간 또는 특정 시계 시간이 지나면 자동으로 데이터를 제거하도록 할 수 있습니다.

다음 환경에서 호스팅되는 배포에 대한 데이터를 쿼리할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 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 " 기능을 사용하여 컬렉션에서 문서를 삭제하지 않습니다.

Atlas UI 에서 데이터를 만료하려면 다음 단계를 따르세요.

1
  1. MongoDB Atlas UI의 Database 사이드바에서 버튼을 클릭합니다.

  2. 만료하려는 데이터가 포함된 데이터베이스 배포의 경우 Browse Collections을 클릭합니다.

  3. 왼쪽 탐색 창에서 데이터베이스를 선택합니다.

  4. 왼쪽 탐색 창에서 컬렉션을 선택합니다.

2
  1. Indexes 탭을 클릭합니다.

  2. Create Index를 클릭합니다.

3
  1. Fields 0} 섹션에 인덱스 키 사양 문서를 입력합니다. 이 예제에서는 다음 텍스트를 입력하여 expiresAfter 필드에 인덱스를 생성합니다.

    { "expiresAfter": 1 }
  2. Options expireAfterSeconds 0} 섹션에 옵션을 입력합니다. 이 예에서는 다음 텍스트를 입력하여 expiresAfter 필드 값 1초 후에 데이터를 만료합니다.

    { expireAfterSeconds: 1 }
  3. Review를 클릭합니다.

  4. Confirm를 클릭합니다.

4
  1. 왼쪽 탐색 창에서 인덱스가 포함된 컬렉션을 선택합니다.

  2. Find 탭을 클릭합니다.

  3. Insert Document를 클릭합니다.

  4. 0} 필드 아래의 텍스트 필드를 클릭하고 _id 필드 이름 을 입력합니다.expiresAfter

  5. 0} 옆의 텍스트 필드를 expiresAfter 클릭하고 다음 값을 입력합니다.

    2023-10-01T12:00:00.000+00:00

    이 값은 2023년 10월 1일 12시 이후 데이터가 만료됩니다.

  6. 데이터 유형 드롭다운 메뉴를 클릭하고 데이터 유형 값을 Date으로 변경합니다.

  7. Insert를 클릭합니다.

    문서가 expiredAfter 필드 값에서 1초 후에 자동으로 만료됩니다.

    TTL 인덱스는 문서가 만료되는 데 1~2초 정도 걸릴 수 있습니다. MongoDB Atlas가 만료된 문서를 삭제하는지 확인하려면 UI를 새로 고쳐야 할 수도 있습니다.

터미널에서 지정된 시간(초)이 지나면 데이터가 만료될 수 있습니다. 인덱싱된 필드에서 지정된 시간(초)이 경과한 후 데이터를 만료하려면 BSON 날짜 유형의 값 또는 BSON 날짜 유형의 개체 배열이 있는 필드에 TTL 인덱스를 만들고 expireAfterSeconds 필드에 0이 아닌 양수 값을 지정합니다. 색인화된 필드에 지정된 시간 이후 expireAfterSeconds 필드의 시간(초)이 지나면 문서가 만료됩니다. [1]

TTL 인덱스 expireAfterSeconds 값은 02147483647 사이여야 합니다.

예를 들어 다음 작업은 log_events 컬렉션의 createdAt 필드에 인덱스를 만들고 10expireAfterSeconds 값을 지정하여 만료 시간을 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 값에서 만료됩니다.

경고

데이터 손실 가능성

TTL 인덱스가 으로 설정된 expireAfterSeconds NaN경우 업그레이드, 다운그레이드 및 특정 동기화 작업으로 인해 예기치 않은 동작이 발생하고 데이터가 손실될 수 있습니다.

TTL 인덱스 구성에서 expireAfterSecondsNaN 로 설정하지 마십시오.

MongoDB 5.0 이전 버전에서는 TTL 인덱스에 expireAfterSecondsNaN로 설정된 경우, MongoDB는 오류를 기록하고 레코드를 제거하지 않습니다.

MongoDB 5.0.0 - 5.0.13(및 6.0.0 - 6.0.1)에서, NaN0로 취급됩니다. TTL 인덱스가 로 구성되어 로 설정된 expireAfterSeconds NaN경우 모든 TTL 인덱스 문서가 즉시 만료됩니다.

MongoDB 5.0.14 (및 6.0.2) 부터 서버는 expireAfterSecondsNaN 로 설정된 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 인덱스를 삭제하거나 수정하세요.

1

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

2}collMod 명령을 사용하여 스크립트에서 발견한 잘못 구성된 expireAfterSeconds 값을 업데이트합니다.

또는 잘못 구성된 TTL 인덱스를 drop 삭제하고 나중에 createIndexes 명령을 사용하여 다시 만들 수 있습니다.

← TTL 인덱스