読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

MongoDBでTTL

概要

TTL(Time To Live)という自動でデータを消す仕組みを利用します。
データによっては「過去xx日までは必要だけどそれ以降は不要」みたいなものがあると思います。 例えばログなど。
そういったものに対して使えます。

環境

インデクス作成

設定はTTLのインデクスを作成するだけです。今回は

createdAtというフィールドが30秒以上経ったらそのドキュメントを消す。

というインデクスを作成します。

> db.ttl_test.ensureIndex({'createdAt': 1}, {expireAfterSeconds: 30})
{
     "createdCollectionAutomatically" : true,
     "numIndexesBefore" : 1,
     "numIndexesAfter" : 2,
     "ok" : 1
}

動作確認

データをインサートします。

> db.ttl_test.insert({name: "1", age: 10, createdAt: new Date()})

データが消えるか確認します。

> db.ttl_test.find()
{ "_id" : ObjectId("54cb0d72013bba81ea6bf176"), "name" : "1", "age" : 10, "createdAt" : ISODate("2015-01-30T04:49:54.222Z") }

~少し待つ~

> db.ttl_test.find()
>

確かに消えました。簡単ですね。

注意点

  • TTLのフィールドはDate型じゃないとダメ
  • TTLのチェック間隔は60秒。なので最大で59秒誤差が生じる
  • Cappedコレクションでは使えない。
  • 既に他のインデクスを作成したフィールドに対しては使えない
  • 複数のフィールドに対してTTLインデクスは作成できない
  • 元々存在するドキュメントにインデクスを付けてもちゃんと消してくれます
  • backgroundオプションをつけると、インデクスつけながら対象を削除。foregroundだとインデクス完了後削除

ソース