Couchbaseにテストデータを作成するnode.jsスクリプト

Couchbaseにテストデータを作成するnode.jsスクリプト
=======

[先日インストールしたCouchbase](http://qiita.com/fujisan3/items/6e7a059b43b4189bd067)に、テストデータを登録してみます。

大量データの投入には、標準のCLIツールである[cbdocloader](http://docs.couchbase.com/admin/admin/CLI/cbdocloader_tool.html)を使えば出来そうな気はしたのですが、勝手知ったるなんとやらで、node.jsで作成してみました。

スクリプトはGithubにも公開しています。
[fujisan3/node.js-scripts](https://github.com/fujisan3/node.js-scripts/blob/master/add-couchbase-data1.js)

## add-couchbase-data1.js
* 作成する件数は、`i < 1000` の部分を変更して下さい
* age の値は乱数で生成します（適当に編集して下さい）

### 利用モジュール
* couchbase [couchbase/couchnode](https://github.com/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!

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/53823/375f4d56-7b88-8e86-1d20-d3ffe90e42ad.png)

### とはいえ
Couchbaseは一意キーを生成しないといけないのがめんどくさい。MongoDBだとJSONだけ突っ込めばいいので楽なんだよね。なんかいい方法はないだろうか。