Database/MongoDB 실습

[MongoDB] TTL 인덱스 생성과 도큐먼트 적재

꽁담 2024. 8. 13. 14:51

 

 

1. MongoDB TTL 인덱스

TTL 인덱스는 특정 시간이 지나면 도큐먼트를 자동으로 삭제하는 기능을 제공한다.

TTL 인덱스는 주로 로그 데이터나 세션 정보 등과 같이 일정 기간 후 자동으로 삭제해야 하는 데이터를 관리할 때 유용하다.

다만 TTL 인덱스 필드값에 시계열 데이터가 적재되지 않으면 지워지지 않는다.

1-1. MongoDB 인덱스 유형

유형 설명
단일 필드 인덱스 특정 필드에 대한 인덱스
복합 인덱스 여러 필드를 조합한 인덱스
해시 인덱스 해시된 값으로 인덱스
텍스트 인덱스 텍스트 검색을 위한 인덱스
2dsphere 인덱스 지리공간 데이터에 대한 인덱스
유일 인덱스 유일한 값만 허용
- 로컬서버 기준에 한정, 샤드서버로 데이터가 분산되는 경우에는 어플리케이션에서 처리

 

 

2. MongoDB 테스트 버전

유형 버전 구성
mongosh 2.2.10  
mongodb 7.0.12 Config : 1개, 포트 20000
Route : 1개, 포트 20001
Shard1 : 1개, 포트 30001
Shard2 : 1개, 포트 40001

 

 

3. TTL 인덱스 생성

3-1. TTL인덱스 생성

TTL 인덱스를 적용하려면 인덱스 필드에 날짜/시간 데이터를 입력하고,

인덱스 생성 시 expireAfterSeconds 옵션을 지정한다.

[direct: mongos] indexDB> db.ttlIndex.createIndex( { "createdAt" : 1 }, { expireAfterSeconds : 10 } )
createdAt_1

 

 

4. TTL 인덱스에 적재 테스트

4-1. TTL 인덱스에 데이터를 적재

# 현재시간으로 데이터 적재
[direct: mongos] indexDB> db.ttlIndex.insertMany( [ { "Number" : 1 , "createdAt" : new Date() } ,
                                                    { "Number" : 2 , "createdAt" : new Date() } ,
                                                    { "Number" : 3 , "createdAt" : new Date() } ] )
{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId('66baf24c01027809e11b157f'),
    '1': ObjectId('66baf24c01027809e11b1580'),
    '2': ObjectId('66baf24c01027809e11b1581')
  }
}

# 데이터 조회
[direct: mongos] indexDB> db.ttlIndex.find();
[
  {
    _id: ObjectId('66baf24c01027809e11b157f'),
    Number: 1,
    createdAt: ISODate('2024-08-13T05:42:36.666Z')
  },
  {
    _id: ObjectId('66baf24c01027809e11b1580'),
    Number: 2,
    createdAt: ISODate('2024-08-13T05:42:36.666Z')
  },
  {
    _id: ObjectId('66baf24c01027809e11b1581'),
    Number: 3,
    createdAt: ISODate('2024-08-13T05:42:36.666Z')
  }
]

# 10초후 데이터 조회 시 결과 없음
[direct: mongos] indexDB> db.ttlIndex.find();

[direct: mongos] indexDB>

 

4-2. TTL 인덱스에 시계열 필드가 아닌 데이터 적재

# Number 4 의 createdAt 필드에 문자열 데이터를 적재
[direct: mongos] indexDB> db.ttlIndex.insertMany( [ { "Number" : 1 , "createdAt" : new Date() } ,
                                                    { "Number" : 2 , "createdAt" : new Date() } ,
                                                    { "Number" : 3 , "createdAt" : new Date() } ,
                                                    { "Number" : 4 , "createdAt" : "Sample String" } ] )
{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId('66baf3d401027809e11b1582'),
    '1': ObjectId('66baf3d401027809e11b1583'),
    '2': ObjectId('66baf3d401027809e11b1584'),
    '3': ObjectId('66baf3d401027809e11b1585')
  }
}

# 데이터 조회
[direct: mongos] indexDB> db.ttlIndex.find();
[
  {
    _id: ObjectId('66baf3d401027809e11b1582'),
    Number: 1,
    createdAt: ISODate('2024-08-13T05:49:08.657Z')
  },
  {
    _id: ObjectId('66baf3d401027809e11b1583'),
    Number: 2,
    createdAt: ISODate('2024-08-13T05:49:08.657Z')
  },
  {
    _id: ObjectId('66baf3d401027809e11b1584'),
    Number: 3,
    createdAt: ISODate('2024-08-13T05:49:08.657Z')
  },
  {
    _id: ObjectId('66baf3d401027809e11b1585'),
    Number: 4,
    createdAt: 'Sample String'
  }
]

# 10초 후 데이터 조회 - 시계열이 아닌 데이터는 지워지지 않음
[direct: mongos] indexDB> db.ttlIndex.find();
[
  {
    _id: ObjectId('66baf3d401027809e11b1585'),
    Number: 4,
    createdAt: 'Sample String'
  }
]

[direct: mongos] indexDB>