面倒なんで前置きは省略して
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っぽい使い方しようよ>俺