はじめに
今回はドキュメント指向型データベースの代表としてMongoDBを取り上げます。ドキュメント指向型データベースはRDBMSと違って,スキーマ(テーブル定義)が必要ないことが大きな特徴です。
今回も利用したコードやプログラムはgithubに置いてあるので適宜参照してください。
MongoDBの特徴
前々回,前回と紹介したmemcachedやTokyoTyrantは基本的にRDBMSと組み合わせて,「RDBMSの弱い部分を補う」という使い方でした。しかしMongoDBは少し違っていて,JOINが行えないこととトランザクションをサポートしていないこと以外は,ほぼRDBMSと同じように扱うことができるため,「RDBMSの代替として使う」ことが可能です。
上述したようにMongoDBはRDBMSと違ってJOINはできませんが,代わりに基準となるオブジェクトに別のオブジェクトをあらかじめembedded(埋め込み)させておくことで,ある程度同じように扱うことができます。また,データを配列形式で保持したり,その配列形式のデータに対して検索を行ったりすることも簡単にできます。shardingによってスケールさせやすいというのも特徴です。
ただし,データの保存先ファイルはあらかじめ大きなサイズで作成される仕様のため,ディスク使用量は大きくなる傾向があります(※1)。
- ※1
- 詳しくは,公式ドキュメントの「開発者FAQ-なぜ私のデータはそんなに巨大なんですか」を参照してください。
どんなところに使える?
カラムを固定できない場合に有効です。あらかじめたくさんのカラムを用意しておくことでも対応は可能ですが,マジックナンバーのようなカラムが増えてしまうと,運用しづらくなってしまいます。
また,RDBMSで開発を行っている場合,テーブルのスキーマが変更になるたびにデータベース側とアプリ側で修正を行わなければいけません。そういった場合,MongoDBであればスキーマレスなのでアプリ側のプログラムのみ修正すれば良いです。
- 具体的な利用シーン
- カラムを固定出来ない場合
- 開発時など,スキーマの変更が頻繁に行われるような場合
MongoDBを試す(1台)
それでは実際にMongoDBを利用してみましょう。まずはMongoDB(mongodサーバ)を1台のみ立ち上げて,Javascriptシェルなコマンドラインから動作を確認してみます(※2)。コレクションというのが聞き慣れないと思いますが,これはRDBMSのテーブルに相当します。
コマンドラインからMongoDBの基本操作を試す
MongoDB shell version: 1.4.3 url: test // 何も指定しなければtestデータベースに接続する connecting to: test type "help" for help > show dbs // データベース一覧を表示する admin local > db.hoge.save( { name : "太郎" } ) // hogeコレクションにデータを新規作成する > db.hoge.find() // hogeコレクションのデータを一覧表示する { "_id" : ObjectId("4c27bc5ca8b636b30c43c917"), "name" : "太郎" } > show dbs // testデータベースが自動的に作成された admin local test > show collections // testデータベース内のコレクションを一覧表示する。hogeコレクションが自動的に作成された hoge system.indexes
RDBMSと違って事前にテーブルを作成したり,スキーマを定義する必要はありません。それらは必要に応じて自動的に作成されます。
- ※2
- MongoDBはデフォルトで27017番ポートを使用します。
MongoDBを試す(sharding)
今度は,複数のmongodサーバを立ち上げて使ってみます。MongoDBでサポートされているsharding(※3)を試してみましょう。mongod, config, mongosという3種類のサーバが登場します。
shardingを使うと,mongosにアクセスすることで透過的にmongodクラスタへアクセスすることができるようになります。本来は複数サーバで行うものですが,今回はテストなので同一サーバで行いました。
mongod, config, mongosを起動する
mongod --dbpath tmp/mongodb/a --port 10000 > tmp/shard_a.log & mongod --dbpath tmp/mongodb/b --port 10001 > tmp/shard_b.log & mongod --dbpath tmp/mongodb/config --port 20000 > tmp/config.log & mongos --configdb localhost:20000 > tmp/mongos.log &
shardingの設定を行います。設定はconfigサーバに保存されます。
shardingの設定を行う
MongoDB shell version: 1.4.3
url: test
connecting to: test
type "help" for help
> db.runCommand( { addshard : "localhost:10000", allowLocal : true } ) // 10000番ポートをshardとして追加
{ “ok” : 1, “added” : “localhost:10000” }
> db.runCommand( { addshard : "localhost:10001", allowLocal : true } ) //10001番ポートをshardとして追加
{ “ok” : 1, “added” : “localhost:10001” }
> db.runCommand( { listshards : 1 } );
{
"shards" : [
{
"_id" : ObjectId("4c27cf028ce643a969355dfc"),
"host" : "localhost:10000"
},
{
"_id" : ObjectId("4c27cf0f8ce643a969355dfd"),
"host" : "localhost:10001"
}
],
"ok" : 1
}
> db.runCommand( { enablesharding : “test” } ) // testデータベースでshardingを行える状態にする
{ “ok” : 1 }
> db.rucCommand( { shardcollection : “test.hoge”, key : { name : 1 } } ) // hogeコレクションをnameでshardingする
{ “ok” : 1 }
- ※3
- shardingは,データの保存/読み出しを複数のサーバに対して振り分ける仕組みです。

