MongoDBにおけるTTLインデックスによる自動データ削除設定
MongoDBでは、TTL(Time-To-Live)インデックスを利用して、指定時間経過後にデータを自動的に削除できます。この機能は定期的なクリーンタスクとして機能し、履歴データやログの自動削除に役立ちます。
基本的な使い方
TTLインデックスを利用するには、対象コレクションの日付型フィールドにインデックスを作成し、有効期限を設定します。日付型フィールドは必須です。
1. 日付フィールドの作成
まず、有効期限を管理する日付フィールドをドキュメントに追加します。例えば、ドキュメントの作成日時を記録する場合:
{
"username": "yamada",
"status": "active",
"created_at": ISODate("2023-05-15T08:30:00.000Z")
}
2. TTLインデックスの作成
次に、createIndexメソッドを使用してTTLインデックスを作成します。expireAfterSecondsオプションで秒単位の有効期限を指定します。
例1: 作成から180秒後に削除
db.logs.createIndex({"created_at": 1}, {expireAfterSeconds: 180})
この設定により、ドキュメント作成から180秒後に自動的に削除されます。
例2: 特定の日時に削除
特定の日時に削除する場合は、ドキュメントに削除予定日時フィールドを追加し、expireAfterSecondsを0に設定します。
// ドキュメントに削除予定日時を設定
db.logs.insertOne({
"message": "一時データ",
"delete_at": ISODate("2023-12-31T23:59:59.000Z")
})
// TTLインデックスの作成
db.logs.createIndex({"delete_at": 1}, {expireAfterSeconds: 0})
TTLインデックスの変更方法
既存のTTLインデックスの有効期限を変更するには、古いインデックスを削除して新しいインデックスを作成する必要があります。
ステップ1: 現在のインデックスの確認
db.collection.getIndexes()
ステップ2: 古いTTLインデックスの削除
db.collection.dropIndex("expireAt_1")
ステップ3: 新しいTTLインデックスの作成
db.collection.createIndex({"expireAt": 1}, {expireAfterSeconds: 3600})
ステップ4: 動作確認
テストデータを挿入して、指定時間後に削除されることを確認します。
db.collection.insertOne({"expireAt": new Date()})
db.collection.find()
重要な注意点
- インデックス対象のフィールドは日付型(Date)である必要があります
- 削除処理は非同期で実行され、デフォルトで60秒ごとにスキャンされます
- 単一フィールドインデックスのみサポートされ、複合インデックスは利用できません
- ドキュメント更新時には、有効期限フィールドも更新する必要があります
実際の使用例
セッションデータの一時保存などにTTLインデックスを活用できます。
// セッションコレクションにTTLインデックスを作成
db.sessions.createIndex({"last_accessed": 1}, {expireAfterSeconds: 1800})
// ユーザーセッションを登録
db.sessions.insertOne({
"user_id": 12345,
"session_data": {"token": "abc123"},
"last_accessed": new Date()
})
この設定により、最終アクセスから30分(1800秒)後にセッションデータが自動的に削除されます。