python motor TTL 설정

H.GOO·2024년 5월 28일
1
post-thumbnail

mongoDB TTL 설정 공식 문서

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

공식문서 내용을 보면, TTL 기능은 인덱스에서 날짜 유형 값을 읽고 컬렉션에서 만료된 문서를 제거하는 mongodb의 백그라운드 스레드를 사용합니다. 라고 설명하고 있다.

즉 데이터에 만료 날짜를 설정하려면 두가지 작업을 해야한다.

  1. createIndex 세팅
  2. Data INSERT 시, 1에서 설정한 key에 createdAt 시간 넣어주기

위 두가지 작업을 해두면 mongodb 의 백그라운드 스레드가 만료된 문서를 자동으로 제거해준다.


createIndex 란?

데이터 베이스에서 인덱스는 책의 색인(index)처럼 작동하여 특정 데이터를 빠르게 찾을 수 있게 한다.
index를 기본으로 생성할 수도 있지만 createIndex 를 통해 index에 특별한 옵션을 줄 수 있다.


ex. 성능 최적화, 쿼리 효율성, 정렬된 결과, 유일성 제약조건을 적용할 수 있다.



mongo SH 예시

> use TEST
> db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 10 } )
> db.log_events.insertOne( { "createdAt": new Date(), "logMessage": "TTL Test!" } )

예시 화면
새로고침 하면 10초 뒤에 없어지는 것 확인.

  • TTL 체크 주기가 따로 있는 것 같음
  • 정확히 10초가 아닌, 특정 주기마다 만료 데이터 체크 후 삭제하는 것으로 보임.




python motor 예시

import motor.motor_asyncio
from datetime

client = motor.motor_asyncio.AsyncIOMotorClient('mongodb://root:1234@mongodb:27017')
db = client.TEST
collection_logs = db.logs

# 로그 TTL 설정
collection_logs.create_index([("ttl_1y", 1)], expireAfterSeconds=365*86400) # 1년
collection_logs.create_index([("ttl_1m", 1)], expireAfterSeconds=30*86400) # 1개월


# mongoDB INSERT
async def update_log(log):
  # 1년으로 설정할 경우
  log["ttl_1y"] = datetime.utcnow()
  # 1개월로 설정할 경우
  log["ttl_1m"] = datetime.utcnow()
  
  await collection_logs.insert_one(log)
  return True

0개의 댓글