MacBookにMongoDBをセットアップしてみた。

オブジェクト指向データベースであるMongoDBを触ってみたかったので、MacBookにセットアップしてみました。

環境

Mac
OS X 10.5 32bit(Leopard)
MongoDB
1.4.3
バイナリ
MongoDB公式が配布している物

インストールというか設置

まずMongoDB公式からダウンロードします。

$ ls -l@ mongodb-osx-i386-1.4.3.tar 
-rw-r--r--@ 1 myuser  staff  75847680  6 14 19:26 mongodb-osx-i386-1.4.3.tar
	com.apple.quarantine	      42 

MacではExtended Attributeという属性があり、ダウンロードしたファイルには com.apple.quarantine が付きます。
ls するとパーミッションの右側にアットマークが付いていると、Extended Attribute があるという事みたい。

$ xattr -d com.apple.quarantine mongodb-osx-i386-1.4.3.tar
$ ls -l@ mongodb-osx-i386-1.4.3.tar 
-rw-r--r--  1 myuser  staff  75847680  6 14 19:26 mongodb-osx-i386-1.4.3.tar

気にしなくても問題はないけど、せっかくなので消しておきます。
あらかじめ消しておかないと、中身全部に com.apple.quarantine が付いた形で解凍しちゃいます。
どうもネットでちょっと調べた*1限り、xattrコマンドは再帰的な処理は出来なさそうなので、消すなら解凍する前が良いです。

$ sudo mv mongodb-osx-i386-1.4.3 /usr/local
$ cd /usr/local
$ sudo chown -R root:wheel mongodb-osx-i386-1.4.3/
$ sudo ln -s mongodb-osx-i386-1.4.3 mongodb
$ sudo ln -s /usr/local/mongodb/bin/* /usr/local/bin/
$ sudo ln -s /usr/local/mongodb/lib/* /usr/local/lib/
$ sudo ln -s /usr/local/mongodb/include/* /usr/local/include/

どこに置くか迷ってTwitterでつぶやいたら、/usr/local か ~/local がいいよと教えてもらいました。
最初は ~/local にしようかと思ったけど、あんまり PATH 通す場所を増やすのもよくないかと思い直し、/usr/local にしました。
/usr/local はソースコードからコンパイルしたものってイメージがあったんですよね。
でも、もう他にもバイナリをダウンロードして導入したコマンドとか、忘れてたけど実はあったので。


/usr/local が root:wheel なので、それに倣います。
ただ、なぜか自分の環境では /usr/local/include と /usr/local/lib だけ、myuser:admin になってて、/usr/local/bin や /usr/local/share は root:wheel なんですよね。
たしか /usr/local は最初は空っぽだった気がするので、この辺は自分で作ってるはずなんですが、なんでこんな設定にしたんだろう・・・
まぁあと、/usr/local/bin にPATHが通ってるのでシンボリックリンクを作成したけど、lib と include まで必要だったかは不明。

起動

$ ls /usr/local/mongodb/bin/
mongo		mongodump	mongofiles	mongorestore	mongosniff
mongod		mongoexport	mongoimport	mongos		mongostat

10個ほどコマンドがありますが、起動は mongod です。
たぶん Mongo daemon なんでしょう。

データベースファイルのパス

そのまま起動すると /data/db/ (または c:\data\db) にデータベースファイルを置くみたいです。
そんな場所に作られるのは嫌なので、--dbpath オプションで場所を指定します。

$ mongod --dbpath ~/tmp/mongodb
Tue Jun 15 02:01:44 Mongo DB : starting : pid = 15695 port = 27017 dbpath = /Users/myuser/tmp/mongodb master = 0 slave = 0  32-bit 

** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data
**       see http://blog.mongodb.org/post/137788967/32-bit-limitations for more

Tue Jun 15 02:01:44 Assertion: 10296:dbpath (/Users/myuser/tmp/mongodb) does not exist
0x68572 0x247814 0x24821a 0x24a855 0x1e06 
 0   mongod                              0x00068572 _ZN5mongo11msgassertedEiPKc + 514
 1   mongod                              0x00247814 _ZN5mongo14_initAndListenEiPKc + 548
 2   mongod                              0x0024821a _ZN5mongo13initAndListenEiPKc + 42
 3   mongod                              0x0024a855 main + 4917
 4   mongod                              0x00001e06 start + 54
Tue Jun 15 02:01:44   exception in initAndListen std::exception: dbpath (/Users/myuser/tmp/mongodb) does not exist, terminating
Tue Jun 15 02:01:44  dbexit: 
Tue Jun 15 02:01:44 	 shutdown: going to close listening sockets...
Tue Jun 15 02:01:44 	 shutdown: going to flush oplog...
Tue Jun 15 02:01:44 	 shutdown: going to close sockets...
Tue Jun 15 02:01:44 	 shutdown: waiting for fs preallocator...
Tue Jun 15 02:01:44 	 shutdown: closing all files...
Tue Jun 15 02:01:44      closeAllFiles() finished
Tue Jun 15 02:01:44  dbexit: really exiting now

エラーで起動しませんでした。--dbpathで指定したディレクトリが無いと起動しません。

$ cd ~
$ mkdir tmp
$ mkdir tmp/mongodb
$ mongod --dbpath ~/tmp/mongodb &
Tue Jun 15 02:02:03 Mongo DB : starting : pid = 15697 port = 27017 dbpath = /Users/myuser/tmp/mongodb master = 0 slave = 0  32-bit 

** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data
**       see http://blog.mongodb.org/post/137788967/32-bit-limitations for more

Tue Jun 15 02:02:03 db version v1.4.3, pdfile version 4.5
Tue Jun 15 02:02:03 git version: 47ffbdfd53f46edeb6ff54bbb734783db7abc8ca
Tue Jun 15 02:02:03 sys info: Darwin broadway.local 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:55:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_I386 i386 BOOST_LIB_VERSION=1_40
Tue Jun 15 02:02:03 waiting for connections on port 27017
Tue Jun 15 02:02:03 web admin interface listening on port 28017

ちゃんとディレクトリを作ったら起動しました。
ついでに最後に & を置いてバックグラウンドで動かします。
ポート28017番をListenして、ポート28017番にwebインターフェースの管理画面があるようです。

localhost:28017

リッチな管理画面を期待しましたが、画像の通りかなり質素な感じです。

MongoDBには、Http Interfaceが付属しているようです。

CouchDBと違って、データの更新等は行えないようですが、
・サーバーのステータス
・登録されているデータの参照
これらが行えるようですので、デバッグに使えると思います。

中略

http://[サーバーIP]:28017/[データベース名]/[コレクション名]/
にアクセスすると、該当コレクションに登録されてるデータが表示されます。
※最後のスラッシュは必須です。

試しにhttp://[サーバーIP]:28017/test/foo/にアクセスすると、こんな感じで
登録されているデータが表示されました。

MongoDBのHttp Interface - Symfoware

どうやら、スクリーンショットを撮った画面以外に、どんなドキュメントが格納されているかを確認できるようです。
まだ何もデータが無いので、スクリーンショットはありませんけど。

JavaScriptシェル

$ mongo
MongoDB shell version: 1.4.3
url: test
connecting to: test
type "help" for help
> show dbs
admin
local

MongoDBのコマンドラインクライアントはJavaScriptシェルになってます。
とりあえず、動いてるみたいです。

*1:マニュアルが無いらしく、man xattrしても使い方が分かりません。