-> 11 { 12 / 20 }
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(); }
コメント
トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20111220