2012年11月24日土曜日

Node.jsが面白い件③ MongoDBで遊ぶ 〜基本編〜

今回はMongoDBの使い方についてです。MongoDBは有名なNoSQLの1つで、Redisと同じようにNode.jsでも簡単に使えます。MongoDB Native NodeJS Driverをダウンロードし、こちらのマニュアルに沿って記述すれば基本的な使い方はO.K.です! ・・・で終わると書いている意味もないので、ここでは基本的な使い方を記述して行きます。 まずはいつも通りnpmでインストール!
 > npm install mongodb

続いて、データベースに接続してコレクションを作成した後ドキュメントを挿入し、コレクションを削除するという簡単なサンプルプログラム。
var mongo = require('mongodb');

// ドキュメントサンプル。
var doc1 = {'key1':'val1'};
var doc2 = {'key2-1':'val2-1', 'key2-2':'val2-2'};
var docs = [doc1, doc2];

// serverの設定。
var server = new mongo.Server('localhost', 27017, {auto_reconnect: true});

// dbの設定。
var db = new mongo.Db('exampleDb', server, {safe:true});
//var db = new mongo.Db('exampleDb', server);

var closeDB = function() {
    db.close(true, function(err, result) {
        console.log("close!");
    });
}

// コネクションオープン。
db.open(function(err, db) {
    if (!err) {
        console.log("open!");
        // コレクションの作成。既に存在する場合はエラー。
        db.createCollection('collection1', {strict:true}, function(cerr, collection) {
            if (!cerr) {
                console.log("create!");

                // ドキュメントの格納。
                collection.insert(docs, function(ierr, res) {
                    if (!ierr) {
                        console.log("insert doc1!");

                        // ドキュメントの検索。
                        collection.find().toArray(function(ferr, items) {
                            if (!ferr) {
                                console.log(items);

                                // コレクションの削除。
                                collection.drop();
                                closeDB();
                            } else {
                                console.log(ferr);

                                collection.drop();
                                closeDB();
                            }
                        });
                    } else {
                        console.log(ierr);

                        collection.drop();
                        closeDB();
                    }
                });
            } else {
                console.log(cerr);

                closeDB();
            }
        });
    } else {
        console.log(err);
    }
});

MongoDBでは、今のところデフォルトで書き込みの結果を待たずにリターンを返します(safe=false)。つまり、書き込みが成功したか失敗したかがすぐにわかりません。これは、データベースを作成する際にsafe=trueを設定することで変更できます。また、書き込みの挙動は以下のように設定することができます。
  1. j:ジャーナル(redoログのようなもの)のコミットを待つ。ジャーナルが設定されていなければそのまま返す。
  2. w:レプリカに指定数反映されるのを待つ。タイムアウト指定も可能。
  3. fsync:ジャーナリングされてない場合は全てのファイルをfsyncするのを待つ。ジャーナリングしている場合は次のグループのコミットを待つ。非推奨なのでjを使うべき。

MongoDBでは動的にcollectionを作成するケースも多いですが、既に作成しようとするcollection存在する場合はエラーを受け取りたい、という場合もあります。その場合はcreateCollectionでstrict:trueを指定します。
  1. createCollectionでstrict:false(デフォルト)の場合、既に存在する場合は何もしない(作成しない)
  2. createCollectionでstrict:trueの場合、既に存在する場合はエラーを返す。
  3. collectionでstrict:false(デフォルト)の場合、コレクションが存在しない場合は最初のinsertで作成する。
  4. collectionでstrict:trueの場合、コレクションが存在しない場合はエラーを返す。
サンプルプログラム内ではinsert/findを実施しています。この辺りはupdateやdeleteも含めて多くの処理がありますので、ドキュメントを見ながら実装していけばよいと思います。
Node.jsというよりMongoDBの話になりましたが、他の言語でMongoDBを使っている開発者ならかなり違和感なく使えそうですね。また、MongoDBはWeb上にもドキュメントが揃ってきていますので、NoSQL初心者でも比較的情報は得やすいですね。

0 件のコメント:

コメントを投稿