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 <ダンプ先>
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 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自体がそういうサービスなんだろうけど。