主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MongoDB: TTLをPymongoやMotorで使う上で

                
tags: mongoDB
 MongoDBの各ドキュメントにはいわゆる寿命と呼べるTTL(Time To Live)を設定できる。これは任意の時間を指定するもので、その時間が経過するとドキュメントは自動で削除される。MongoDBのJavaScriptコマンドラインから使うにはまず以下のようにインデクスを作る。
db.foo.ensureIndex({createdAt:1}, {expireAfterSeconds:15})


 続いてTTLを設定したいドキュメントに"createdAt"キーで現在時刻を入れる(上でcreatedAtキーでインデクスを作っているので)。"createdAt"キーを入れなければ、TTLは設定されない。
db.foo.insert({createdAt:new Date(), foo:"foo"})


 で、expireAfterSecondsで指定時間したが経過すればドキュメントは自動で消える。
 この機能はcreatedAtに入れられた時間とコンピュータの時計から時間差を出して、それが指定時間を超えるなら削除するようになっている。経過時間をカウントするタイマーのようになっているわけではない。他言語からドライバを使ってTTLを指定する場合、そこらを留意しなければならない。Pythonでもう一度これまでの手順を踏んでみる。ドライバはPymongoを使って適当に。

 まずインデクスを作る。
db.session.ensure_index("createdAt", expireAfterSeconds = 15)


 続いてドキュメントをインサート。
#db.foo.insert({"createdAt":datetime.datetime.now(), "foo":"foo"})
db.foo.insert({"createdAt":datetime.datetime.utcnow(), "foo":"foo"}) # Use UTC TIME!

 上のインサートはまずくて下のインサートはOK。上だとTTLが狙いどおりに働かない。コンピュータの時間とcreatedAtキーに入れられた時間を比較して消去の判断がされると書いた。んでMongoDB側は時差を抜いた標準時を使う。pythonのdatetimeオブジェクトのnowメソッドは時差ありの現地時間を返す。なのでnowメソッドでなくutcnowメソッドで標準時にそろえておかなければならない。

 というわけでMongoDBにドライバを使って他言語から使う場合、TTLのためには標準時で時間を提供しなければならないということ。ちなみにMotorでもPymongoとほぼ同じように使える。

http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.ensure_index
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。