A Day in the Life

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();
}
記事の一覧 >