data engineering

mongodb set ttl

qkqhxla1 2020. 8. 15. 17:50

https://docs.mongodb.com/manual/tutorial/expire-data/


특정 시간 이후에 데이터를 자동으로 삭제하고 싶을 경우 ttl을 활용한다. mongodb에는 ttl인덱스가 있다.

db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )

When adding documents to the log_events collection, set the createdAt field to the current time:

db.log_events.insert( {
   "createdAt": new Date(),
   "logEvent": 2,
   "logMessage": "Success!"
} )

일부 자료를 가져왔는데.. 저런식으로 createIndex명령어로 createdAt필드에 expireAfterSeconds옵션을 3600초를 주고 만들면 된다. 데이터 insert시에는 인덱스를 건 createdAt필드에 Date()타입을 넣어주면 정해진 시간 이후로 자동으로 삭제가 된다.


난 몽고 컨트롤을 하는데 파이썬을 쓰기에 pymongo로 했는데.. pymongo로 ttl을 세팅할때는 timezone을 utc로 설정해야한다고 한다.(이상하네요.) https://api.mongodb.com/python/current/api/pymongo/collection.html 를 읽어보면 


expireAfterSeconds: <int> Used to create an expiring (TTL) collection. MongoDB will automatically delete documents from this collection after <int> seconds. The indexed field must be a UTC datetime or the data will not expire.


이렇단다. utc로 설정하지 않고 넣어주면 지워지지 않는다고 한다.(적었지만 pymongo기준임.) 대충 테스트코드를 짜서 돌려본 결과 10초 뒤에 잘 지워지는걸 확인했다.

# -*- coding: utf-8 -*-

from pymongo import MongoClient, ASCENDING
from datetime import datetime
from pytz import timezone
import urllib

class ttl:
    def __init__(self):
        host, mongo_id, mongo_password = 'x.x.x.x', 'id', 'password'
        id = urllib.pathname2url(mongo_id)
        pw = urllib.pathname2url(mongo_password)
        self.client = MongoClient('mongodb://{}:{}@{}'.format(id, pw, host), connect=False)
        self.item_db = self.client['db']
        self.collection = 'test'

    def make_index(self, db, collection, indexcol_list, index_name):
        db[collection].create_index(
            [(eachcol, ASCENDING) for eachcol in indexcol_list],
            name=index_name,
            background=True,
            expireAfterSeconds=10,  # seconds
        )

    def test(self):
        self.make_index(self.item_db, self.collection, ['created'], 'expire index')  # expire용 인덱스를 만들어줌.
        self.item_db[self.collection].insert_one({'created': datetime.now(timezone('UTC')), 'rara': 'haha'})  # 인덱스를 만든 created필드에는 timezone UTC의 date를 넣어줌.

t = ttl()
t.test()