mongodb で capped と capped でないコレクションの変換
mongodb で capped と capped でないコレクションの変換
現状ふつうには出来ないぽいので、いったんテンポラリテーブルをつくって、そこに書き込み、最後 rename する、みたいな。昔の RDB を思い出す感じ…。
たとえば capped な DB にしたい場合は
db.noncapped.validate(); // validate で size, max がどれぐらい必要か見積もっておく
change_collection_type(db.noncapped, {capped: true, size: 1000000000});
db.noncapped.validate(); // capped:1 になってる
change_collection_type はこれ。ほんと JS すな〜。bulk insert じゃないので速度遅いけど、500Mぐらいのオンメモリなデータなら10秒ぐらいで終わった。だれか bulk insert 版書いて下さい。あとこのコレクションに CRUD の操作が走ってる場合、アップデート中その操作は失われると思います。(ロックされないので)
function change_collection_type(collection, options) {
var collection_name = collection.getName();
var tmp_name = 'tmp_change_collection.' + collection_name;
var remove_name = 'tmp_change_collection.remove.' + collection_name;
var collection = db[collection_name];
db.createCollection(tmp_name, options);
var tmp = db[tmp_name];
collection.find().forEach(function (d) { tmp.insert(d) });
collection.renameCollection(remove_name);
tmp.renameCollection(collection_name);
db[remove_name].drop();
}