LoginSignup
76
73

More than 5 years have passed since last update.

minimongoでIsomorphic Storage

Last updated at Posted at 2014-11-27

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デザインについてはあとで自分とこのブログに書きたい。

76
73
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
76
73