MongoDB TTL인덱스
node.js에서 서버로 데이터를 입력하거나 출력할 때 사용할 수 있는 데이터베이스 중 하나로 MongoDB가 있습니다. 사용 방법도 간단하고 자료가 많아서 node.js를 막 시작했을 때 접해보기 좋습니다.
MongoDB에서는 'TTL (Time To Live)' 인덱스를 사용하여 일정 시간이 지나면 자동으로 데이터가 삭제되도록 할 수 있습니다.(공식 문서 참고)
만료시간 설정하기
await db.collection('테이블이름').createIndex({ "createdAt": 1 }, { expireAfterSeconds: 3600 })
MongoDB 클라이언트를 통하여 'createAt' 필드에 대한 TTL인덱스를 생성할 수 있습니다.
여기서 'expireAfterSeconds'가 만료되기까지의 초를 의미합니다. 3600은 1시간을 의미합니다.
여러 시간대를 설정할경우
await db.collection('테이블이름').dropIndex("createdAt_1");
MongoDB에서 'createIndex'를 호출할 때, 인덱스가 이미 존재하면 기존 인덱스를 수정하지 않고 그대로 유지합니다. 만약에 여러조건에 따른 createIndex를 여러개를 생성한다면 새로운 create Index전에 위 코드를 작성하여 기존의 create Index를 제거하고 다시 생성할 수 있습니다.
const indexInfo = await db.collection('테이블이름').indexInformation()
if (indexInfo.createdAt_1) {
await db.collection('테이블이름').dropIndex("createdAt_1")
}
기존의 인덱스가 존재하지 않을경우에는 MongoServerError: index not found with name [createdAt_1] 에러가 발생하니 다음과같이 기존 인덱스가 존재할때만 삭제하도록합니다.
Node.js 적용해보기
app.post('/save', async (req, res) => {
const value = req.body.value;
const createdAt = new Date(); // 현재 시간을 생성합니다.
try {
await const result = await db.collection('테이블이름').insertOne({ value, createdAt }, { expireAfterSeconds: 3600 }));
} catch (e) {
res.render("home", { value });
}
});
await을 사용한 비동기코드를 사용할땐 'async'를 사용해야 합니다
form을 통한 'POST' 요청을 받은 '/save'에서 MongoDB에 현재 시간을 포함한 서버에 저장할 데이터를 저장합니다.
'createAt'은 데이터의 만료시간을 나타내고 1시간이 지나면 삭제됩니다.
예를 들어, 첫 번째 문서가 10시 00분 00초에 삽입되었다면 'createdAt' 필드는 "2024-06-29T10:00:00Z"와 같은 값을 가질 것입니다. 이 문서는 1시간 후인 11시 00분 00초에 자동으로 삭제됩니다.