Tech Sketch Bucket of Technical Chips by TIS Inc.

MongoDBのドキュメントを一定時間経過後に自動で削除する

Pocket

この記事はeXcale Developer's Blogから移転されたものです。


eXcale 開発チームの泉谷です。
今回は、MongoDBのドキュメントにTTLを設定し、一定時間経過後に自動で削除する方法を紹介します。


TTLを設定するメリット

ドキュメントにTTL(Time To Live)を設定することで、古いドキュメントをMongoが自動で削除してくれるようになります。
TTLがあればデータベースの容量が膨らんでいくことを防止したり、過去XX日分を残すといった要件をDB側で実現できるといったメリットがあります。
特にログをMongoDBで扱う際にはこのメリットが生かせると思います。


設定方法

設定はコレクション単位で行います。
設定といっても、実際はインデックスを貼る際にオプションを指定することでTTLを設定することになります。

mongo shellから設定する場合は以下のようにします。

この例ではcreatedAtというフィールドにTTLを設定しています。
このようにexpireAfterSecondsというオプションを付加してインデックスを貼ることでTTLが設定されます。
このとき、インデックスを貼ったフィールドに入る値はDate型である必要があります。Date型以外の値が入った場合はTTLが効かず、削除が行われません。
expireAfterSecondsで設定している値の単位はオプション名通り”秒”なので、この例では300秒=5分をTTLとしています。


動作確認

ではTTLを設定したコレクションにドキュメントを挿入して、TTLを超えたドキュメントが削除されるかどうか見てみましょう。

どうでしょうか?
ドキュメントが消えていれば有効になっています。

ここで注意点ですが、TTLのチェック間隔は60秒なので60秒ごとにしか削除は行われません。
TTLを超えたからすぐに削除されるという訳ではなく、あくまでTTLのチェック時にTTLを超えているものを削除するだけです。
そのため設定しているTTLから実際に削除されるまでに最大で59秒の誤差が発生します。

その他の注意点

公式ドキュメントにも記載がありますが、主に以下のような点に注意が必要です。

・既にインデックスが貼られているフィールドにTTL用のインデックスを貼ることはできない

・Cappedコレクションを使用している場合はTTLが使えない

・複数のフィールドにTTL用のインデックスを貼ることはできない


最後に

今回は、MongoDBのドキュメントにTTLを設定する方法を紹介しました。
うまく使えば有効な機能だと思うのでぜひ試してみてください!

エンジニア採用中!私たちと一緒に働いてみませんか?