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

MongoShellのJavaScriptを使って、サーバ間/DB間/コレクション間でデータ移管する方法を紹介します。

やり方は単純で、次のようなJavaScriptコードを書いて実行するだけです。
この方法の利点は、同サーバ内の別DBにデータ移管するときにも、同DB内の別コレクションにデータ移管するときにも使えることです。

サンプルコード

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

人気記事