Couchbaseにテストデータを作成するnode.jsスクリプト
先日インストールしたCouchbaseに、テストデータを登録してみます。
大量データの投入には、標準のCLIツールであるcbdocloaderを使えば出来そうな気はしたのですが、勝手知ったるなんとやらで、node.jsで作成してみました。
スクリプトはGithubにも公開しています。
fujisan3/node.js-scripts
add-couchbase-data1.js
- 作成する件数は、i < 1000の部分を変更して下さい
- age の値は乱数で生成します(適当に編集して下さい)
利用モジュール
- couchbase couchbase/couchnode Couchbase標準ライブラリ
- crypto 登録用の一意キーを生成するため
- async 勉強を兼ねて非同期制御
インストール
(node.js はインストールしておくこと)
1.適当なディレクトリを作成
2.package.jsonファイルを作成
package.json
{
  "devDependencies": {
    "couchbase": "*",
    "crypto": "*",
    "async": "*"
  }
}
3.npm installで依存モジュールをインストール
4.同ディレクトリに、add-couchbase-data1.jsファイルを配置する
実行
# node add-couchbase-data1
スクリプト
var couchbase = require('couchbase');
var crypto = require('crypto');
var async = require('async');
function randomInt (low, high) {
    return Math.floor(Math.random() * (high - low + 1) + low);
}
function md5String (src) {
    var md5hash = crypto.createHash('md5');
    md5hash.update(src, 'UTF8');
    return md5hash.digest('hex');
};
/*
Data Format
---------------
key = MD5 Hash from DocumentData
doc =
{
    "user" : "user-"[1=>i]
    "age" : random[10-90]
}
---------------
*/
var destinationString = 'localhost:8091';
var cluster = new couchbase.Cluster(destinationString);
var bucket = cluster.openBucket('default', function (err) {
    if (err) {
        console.log('Connection Error:', err);
        throw err;
    } else {
        var counter = [];
        for (var i = 0; i < 1000; i++) {
          counter[i] = i;
        }
        async.eachSeries(counter, function(i, next) {
            doc = "{\n";
            doc = doc + "\"user\" : \"user-" + (i+1) + "\" , \n";
            doc = doc + "\"age\" : \"" + randomInt(10, 90) + "\"\n";
            doc = doc + "}\n";
            key = md5String(doc);
            console.log("key=" + key);
            console.log("doc=" + doc);
            bucket.upsert(key, doc, function(err, result) {
                if (err) {
                    console.log('Insert Error!' + (i+1));
                    throw err;
                } else {
                }
            });
            console.log('Inserted : ' + (i+1));
            next();
           
        }, function(err) {
            console.log('Finished!');
            bucket.disconnect();
        });
    }
});
実行例
登録出来ました。こんな感じ。
key=3385b5a19bc14f744aa00d34d3785ce0
doc={
"user" : "user-1" ,
"age" : "16"
}
Inserted : 1
key=41318a900e67b19efc7aec70831c329e
doc={
"user" : "user-2" ,
"age" : "38"
}
Inserted : 2
key=e49f5942dc10f9c8e95d538fd4cba305
doc={
"user" : "user-3" ,
"age" : "55"
}
Inserted : 3
Finished!
とはいえ
Couchbaseは一意キーを生成しないといけないのがめんどくさい。MongoDBだとJSONだけ突っ込めばいいので楽なんだよね。なんかいい方法はないだろうか。
