既存のbrainがあまりにもひどいので自作した。

https://www.npmjs.com/package/hubot-mongodb-brain
https://github.com/shokai/hubot-mongodb-brain

npm installして、external-scripts.jsonに書けば使える。何も設定しなくてもローカルのmongodbか、Herokuならmongolabかmongohqを読み込む。

他のbrainからの移行スクリプトもある。


爆発

以前爆発した時
hubotのbrainが爆発した

hubot-brain-redisは全データを1つのblobとして固めて保存するから、brainのサイズが1.5MBを超えるとRedisToGoのmax memoryにひっかかって保存できなくなる。
そこでhubot-brain-redis-hashに乗り換えたのだが、やっぱり2MB超えたあたりで保存できなくなった。brain-redis-hashもよく見たら1つのblobにまとめて1keyに保存してた。READMEには1つのblobとしては保存しないって書いてあるけど、よくコード読んだら

// brainのデータ構造
{
users: userとroomのリスト
_private: { // この中をrobot.brain.get/setで操作している
key1: value1,
key2: value2,
key3: value3
(略)
}
}
これのusersと_privateを別に保存してるだけなので、全然解決してない。

_privateの中をkey毎に保存するべきで、usersはそもそも用途が無いので保存する必要がない。
hubot-mongodb-brainでは_privateだけ保存するようにした。

他の選択肢

mongo-brainとmongolab-brainも、1 documentに全部固めて保存するのでだめ。そもそもcollections.find().limit(1)とかcollections.find({})とかで取り出してるのが気持ち悪すぎる。