[MongoDB]サーバ間/DB間/コレクション間でデータ移管する方法(JS編)

サンプルコード

server1にあるdb1内のcollection1のデータを、server2のdb2のcollection2に移管します。
migrate.js
var db1 = new Mongo("server1").getDB("db1");
var db2 = new Mongo("server2").getDB("db2");

//コレクションからカーソルオブジェクトを取得
var cursor = db2.collection1.find();
var i = 0;

//カーソルをイテレート
cursor.forEach(function(doc){

    //DB2 にドキュメントを保存
    db2.collection2.save(doc);

    if (db2.getLastError() === null) {
        //成功したら、DB1からドキュメントを削除
        print("ok - " + ++i + " - " + doc._id);
        db1.collection1.remove(doc);
    } else {
        //エラーならエラーメッセージを出力
        print(db2.getLastError());
    }
});
実行方法
mongo --quiet migrate.js

ポイント

new Mongo()で明示的に接続先サーバを指定するのがポイントです。
このように書けば、どのサーバのどのインスタンスに対して処理をしているのかが明確になり可読性が向上します。
また、このスクリプトをserver1で実行してもserver2で実行しても同じ結果になります。
server1とserver2にMongoプロトコルで接続できる環境にあれば、どこからでも(例えばserver3からでも)実行できます。

この処理をcronに書いておけば、定期的に古いデータを別DBに退避させたりするのに便利です。

mongodumpとかmongoexportは引数と挙動の関係がちょっとわかりにくくて覚えるのが面倒なんですが、上記スクリプトなら何をやってるのかわかりやすいのがよいですね。
カテゴリ: