犬ターネット

MongoDB のコレクションで最大要素数を定義してログ代わりにする

2013-03-15 mongodb

ログを MongoDB のコレクションにぶっこみたいけどローテイトすんのめんどくさいなあって思ってたら、コレクション作るときに最大バイト数や最大要素数を指定できた。

> db.createCollection("access_log", { capped:true, size:1000000, max:5 });
{ "ok" : 1 }

capped : コレクションを固定サイズにするかどうか。
size   : 確保するバイト数。capped が true 時に有効。
max    : コレクション内に格納できる最大の要素数。capped が true 時に有効。
(via http://docs.mongodb.org/manual/core/capped-collections/)

とりあえず max:5 を指定して、5要素ぶっこんでみる。

> db.access_log.insert( { id:1, text:"aaa" } );
> db.access_log.insert( { id:2, text:"bbb" } );
> db.access_log.insert( { id:3, text:"ccc" } );
> db.access_log.insert( { id:4, text:"ddd" } );
> db.access_log.insert( { id:5, text:"eee" } );
> db.access_log.find();
{ "_id" : ObjectId("5142b83e3032587e681dc2e5"), "id" : 1, "text" : "aaa" }
{ "_id" : ObjectId("5142b8413032587e681dc2e6"), "id" : 2, "text" : "bbb" }
{ "_id" : ObjectId("5142b8443032587e681dc2e7"), "id" : 3, "text" : "ccc" }
{ "_id" : ObjectId("5142b8463032587e681dc2e8"), "id" : 4, "text" : "ddd" }
{ "_id" : ObjectId("5142b8493032587e681dc2e9"), "id" : 5, "text" : "eee" }

で、6要素目をぶっこむと、

> db.access_log.insert( { id:6, text:"fff" } );
> db.access_log.find();
{ "_id" : ObjectId("5142b8413032587e681dc2e6"), "id" : 2, "text" : "bbb" }
{ "_id" : ObjectId("5142b8443032587e681dc2e7"), "id" : 3, "text" : "ccc" }
{ "_id" : ObjectId("5142b8463032587e681dc2e8"), "id" : 4, "text" : "ddd" }
{ "_id" : ObjectId("5142b8493032587e681dc2e9"), "id" : 5, "text" : "eee" }
{ "_id" : ObjectId("5142b85a3032587e681dc2ea"), "id" : 6, "text" : "fff" }

古い要素が消えて、要素数も 5 のまま維持される。

要素数をもうちょっと増やしたいって場合は、今のところコレクション削除して作り直すしかなさげ。

> db.access_log.drop();
true
> db.createCollection("access_log", { capped:true, size:1000000, max:10 });
{ "ok" : 1 }

要素全部消えちゃうけど、ログだし別にいいや。


ピックの握り方変え中

保育園に育ててもらっている