Kesinの知見置き場

知見を共有していきたいじゃないですか

HerokuのMongoDBにローカルのDBの内容をアップロードする

実は前回紹介した LocationTweetは最近流行りのHerokuで公開しているのですが、データベースで位置情報を簡単に扱うためにHeroku標準のPostgreSQLではなく、MongoHQというアドオンでMongoDBを使用しています。
MongoHQにローカルのデータをアップロードするのに少し手間取ったのでメモしておきます。


Herokuが提供しているPostgreSQLならここを見る限り便利ツールで楽チンっぽいですが(すいません、HerokuのDBが新しくなるときにMongoDBに乗り換えてしまったので実際にやったことないです)、MongoDBだとちょっとめんどくさくなってしまいます。
実はHerokuのアプリのアドオンとして導入したMongoHQには普通にアクセスできるので、MongoDB自体に標準で存在する機能でdump/restoreすることでローカルのデータをアップロードすることが可能です。

ローカルのダンプ

まずはローカルのMongoDBからアップロードしたいdbをダンプします。

$ mongodump -h <host>:<port> -d <ダンプしたいdb名> -o <ダンプ先>

:はMongoDBを自分のPC上で普通にmongodで起動していれば localhost:27017 になるかと思います。

MongoHQへアップロード

次にダンプしたローカルの内容をmongorestoreでMongoHQにアップロードしますが、公式に載っているコマンドを見ると、

$ mongorestore -h hostname.mongohq.com:port_number -d database_name -u username -p password /path/on/my/local/computer

ということで5つほど引数が必要そうな事がわかります。
Herokuのサイトから自分のアプリの設定画面にあるAdd-onsにあるMongoHQのGUIにアクセスすると、Admin項目から
,, は分かりますが、
,は注意が必要です。
はherokuだということが分かりますが、表示されているはハッシュになっているので、このままコピーしてきても認証で怒られてしまいます。実は元のパスワードはMongoHQのGUIをいくら探しても書いていなくて、

$ heroku config

で見られる

MONGOHQ_URL => mongodb://heroku:<password>@<hostname>.mongohq.com:<port_number>/<database_name>

に書いてあります。ここでは伏せてありますが、実際には皆さんのMongoHQの情報が表示されます。
これを見ながら先ほどのmongorestoreを書き換えていきます。

$ mongorestore -h <hostname>.mongohq.com:<port_number< -d <database_name> -u heroku -p <password>  <ダンプしたデータの保存先>

これで先ほどローカルからダンプしたデータをMongoHQにアップロードすることができます。


ちなみに、自分はエラーが出て地理空間インデックスをアップロード先で作られなかったため、

$ mongo <hostname>.mongohq.com:<port_number>/<database_name> -u heroku -p <password>

で直接MongoHQのシェルにアクセスしてインデックスを作成しなおしました。


というか直接シェルにアクセスできるぐらいだから、Herokuのアプリからじゃなくてもアクセスできそうですね。MongoHQ自体がそういうサービスなんだろうけど。