npm install minimongo --save
minimongoは元々isomorphicフレームワーク(サーバーとクライアントのコードを同時に記述するパラダイム)のmeteorの中で使われてた使われた、コアとも言えるDB層であり、ブラウザでもサーバーでも動くように作られている。meteor触る時に一番特徴的な機能だと思う。
これがmeteorから単体で切りだされてForkされていた。meteorで使うのと多少APIが違うが、使える感じだった。(meteorは黒魔術的に非同期処理を隠蔽する機能があり、これをオミットしている)
良さ
- 元々meteorの中で使われたので、比較的実績がある
- mongo shell風のAPIがAPIがクライアントでも使える
僕はmongodb慣れてるのであのAPIでさっくりストレージを使いたい。
後者が目的でlokijs使ってたんだけど動作が不安定すぎて捨てた。
Isomorphic!
purejsで書かれていて、環境ごとにバックエンドを任意に切り替えられるのが最大の特徴。
高速なインメモリモード、クライアントでIndexedDbかWebSQLをバックエンドにしたモード、MongoのREST API に透過するモード、インメモリDBとリモートDBを組み合わせるハイブリットモードがある。(ハイブリッドDBがあるってのはREADMEにあるんだけど、どんな動きに異なるかは把握してない)
学習コストの都合上、インメモリでもなんらかのストレージがバックエンドでも同じようなAPIで叩けるのは強い。要求速度によってバックエンドを変更すればスケールもしなくもなさそう。
こういう、Meteor使わなくてもいいのでMeteorの資産がこういう風に使えるようになるのは嬉しい。
ちなみに今のChromeだとIndexedDbで5MB使える。最近はAtomShell使ってるんだけど、AtomShellだと130MBまで許可されてて強い。
サンプルコード
IndexedDb使う。
var minimongo = require('minimongo');
var test = new minimongo.IndexedDb('test');
test.addCollection('col');
test.col.upsert({a: 1}, function(){console.log('item 1 save done')});
test.col.upsert({a: 2}, function(){console.log('item 2 save done')});
// 取り出す
test.col.find().fetch(function(data){
console.log(data); // [{a:1, _id: 'a2e4ebeac1c540e19f2a71628dacf88d'}, {a:2, _id: "afd3841ce6c7477e9092087012a826e9"}]
})
IndexedDbを使えばちゃんと永続化されてる。
揮発して良いならnew minimongo.MemoryDb('test')
でやればよい。
クライアントでインメモリDBというアプローチの嬉しさ
- サーバーサイドっぽい開発アプローチがクライアントでも適用できる
- ReactがIsomorphicっぽいので相性が良い
やっとクライアントサイドの開発ノウハウが揃ってサーバーの開発ノウハウを応用できるようになってきた感。
APIデザインについてはあとで自分とこのブログに書きたい。