面倒なんで前置きは省略して

MongoDBってデータストア、おもちゃとして面白げ。要はJSONのオブジェクトを出し入れできるDBみたいなもん。
とりあえず1.7.1を落として使ってみる。Unstable版だが大丈夫だ、問題ない。

とりあえずサーバー(mongodコマンド)を動かして、別のコンソールからインタラクティブシェル(mongoコマンド)でつないでみる。

このシェルはJavaScriptが動く。つまりシェル内で計算ができる。たとえばこんなこともできる。

> function fx_() {return function() {print("hoge");}};
> var fx = fx_();
> fx();
hoge

DBのシェルっぽくなくていい感じ。
また、db.eval()を使えばサーバー側のコンテキストでもJavaScriptを実行できる。動的な分散処理が素直に書けそうでこれは期待できるかも。まずはprintしてみる。

> db.eval('print("hoge")');
null

一瞬「あれ?」って思うが、デーモンを起動したサーバー側のコンソールに

hoge

って出てたよ。ちゃんと。
じゃあこんどは

> db.eval(function() {print("hoge")});
null

これでもおk。サーバー側コンソールに "hoge" って出てる。
つぎは、さきほどクライアントで定義したfxをevalしてみる。

> db.eval(fx);
null

これもおk。サーバー側に "hoge" って出てる。
こんどは状態をもたせてクロージャっぽいものを動かしてみる。まずはクライアントで。

> function fc_() {var x = 1; return function() { print(x++); };}
> var fc = fc_();
> fc();
1
> fc();
2

こんな感じ。これをサーバーでやってみるとこんな感じか?

> db.eval(function fc_() {var x = 1; return function() { print(x++); };});
function cf__1__f_() {
    print(x++);
}
> db.eval(function() {fc = fc_();});
Fri Oct 15 23:07:28 uncaught exception: {
        "errno" : -3,
        "errmsg" : "invoke failed: JS Error: ReferenceError: fc_ is not defined nofile_b:1",
        "ok" : 0
}

無理だたw。
これならどうだ?

> db.eval(function() {fc2_ = function() {var x = 1; return function() {print(x++); };}});
null
> db.eval(function() {fc2 = fc2_();});
null
> db.eval(function() {fc2();});
null
> db.eval(function() {fc2();})
null

ちゃんとサーバー側に

1
2

って出てた。一応クロージャっぽい雰囲気にはなった。

> db.eval(function() {fc3 = function() {var x = 1; return function() {print(x++); };}()});
null
> db.eval(function() {fc3();});
null
> db.eval(function() {fc3();});

これでも可。


サーバー側をステートフルにできて一見便利そうだが、すまないMongoDBはクラウドストレージなんだ。クライアントからみるとサーバーは透過的に死んだりする前提なんで、サーバーを再起動すると状態をすっきり忘れるんじゃ実はあんまり使いみちがなかったり。っていうか普通にDBっぽい使い方しようよ>俺