はじめに
ここ最近、
リレーショナルデータベースは、
これらの問題を背景に、
今回は、
MongoDBとは
MongoDBは高いパフォーマンスとスケーラビリティを特徴とするドキュメント指向型データベースです。GNU AGPLv3を採用したオープンソースソフトウェアで、
MongoDBの代表的な機能は以下のとおりです。
- JSONをベースとしたスキーマレスなデータモデル
- B-treeインデックスをサポートする高速なクエリ
- Master-Slave Replicationに加え、
Replica Pairsによるフェイルオーバー構成を選択可能 - 分散データベースを実現するSharding
- 分散処理機構MapReduce
- バイナリデータを効率的に扱う仮想ファイルシステムGridFS
- ストリーミングやロギングに適したCapped Collections
- 各種言語用のドライバが提供されている
(もちろんRubyも)
MongoDBは、

しかし、
それでは、
- The Business Insider
The Business Insiderは、
一日に60万以上のPVがあるサイトのバックエンドとしてMongoDBを採用しました。理由として 「スケーラブル」 「動的言語との相性の良さ」 「スキーマ構成の柔軟さ」 などが挙げられています。1つのMongoDBサーバでCPU利用率は5%程度に収まっているとのことです。 - BoxedIce
BoxedIceは、
サーバ監視システムで使用するデータベースをMySQLからMongoDBに移行しました。主な理由として管理面の問題が挙げられています。MySQLのレプリケーションは特に初回の同期が遅く、 将来的なスケーリングにも不安があったため、 NoSQLデータベースを比較検討した結果MongoDBを採用した顛末が綴られています。 また、
同社のサービスはアカウントの管理や請求処理などには引き続きMySQLを使用しているそうです。 - その他の事例
他にもSourceforgeやGitHub、
New York Timesなどのサービス でMongoDBが採用されています。
これらの事例から、
基本的な使い方
MongoDBのインストールはとても簡単です。ダウンロードページからお使いの環境に合うものをダウンロード・
% wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-1.2.2.tgz % tar xf mongodb-linux-x86_64-1.2.2.tgz
※アーカイブ名・
アーカイブを展開した中のbinディレクトリに各種実行ファイルが収められています。まずはサーバ本体のmongodを起動しましょう。--dbpathオプションに適当なディレクトリを指定してください。そこにデータベースが作られます。
% cd mongodb-linux-x86_64-1.2.2/bin % mkdir -p ~/tmp/mongodb % ./mongod --dbpath ~/tmp/mongodb Mon Feb 8 07:09:16 Mongo DB : starting : pid = 24059 port = 27017 dbpath = /home/ursm/tmp/mongodb master = 0 slave = 0 64-bit Mon Feb 8 07:09:16 db version v1.2.2, pdfile version 4.5 Mon Feb 8 07:09:16 git version: 8a4fb8b1c7cb78648c55368d806ba35054f6be54 Mon Feb 8 07:09:16 sys info: Linux domU-12-31-39-06-79-A1 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_41 Mon Feb 8 07:09:16 waiting for connections on port 27017
別のターミナルで対話型シェルのmongoを起動します。オプションを指定しない場合はlocalhostのデフォルトポート
% ./mongo MongoDB shell version: 1.2.2 url: test connecting to: test type "help" for help >
このシェルは実のところSpiderMonkeyをエンジンとしたJavaScriptコンソールです。計算からメソッド呼び出しまで一通りのことができてしまいます。
> a = 1 + 1 2 > 'hello'.toUpperCase() + a HELLO2
先に進む前に、
- ドキュメント
- リレーショナルデータベースのレコードに相当します。MongoDBではドキュメントをBSON
(バイナリ化されたJSON) として扱います。 - コレクション
- リレーショナルデータベースのテーブルに相当します。複数のドキュメントが格納されます。
- データベース
- 複数のコレクションが格納されます。
ドキュメントの作成
ドキュメントの作成にはdb.<コレクション名>.save
それでは実際に、
> db.users.save({name: 'ursm'})
db.<コレクション名>.find()でドキュメントを取り出せます。
> db.users.find() { "_id" : ObjectId("4b6f40fb047606970896546e"), "name" : "ursm" }
MongoDBはスキーマレスなので、
> db.users.save({name: 'kakutani', blog: 'http://kakutani.com'})
文字列だけでなく、
> db.users.save({name: 'moro', tags: ['ruby', 'rails'], login_count: {today: 5, total: 25}})
ドキュメントの検索
ドキュメントを検索するにはfind()の引数で条件を指定します。名前が"ursm"に一致するドキュメントを検索してみましょう。
> db.users.find({name: 'ursm'}) { "_id" : ObjectId("4b6f40fb047606970896546e"), "name" : "ursm" }
名前に"r"を含むドキュメントを検索します。
> db.users.find({name: /r/}) { "_id" : ObjectId("4b6f40fb047606970896546e"), "name" : "ursm" } { "_id" : ObjectId("4b6f49870476069708965471"), "name" : "moro", "tags" : [ "ruby", "rails" ], "login_count" : { "today" : 5, "total" : 25 }}
"ruby"というタグが付けられたドキュメントを検索します。値が配列のキーに対して単一の値で検索すると、
> db.users.find({tags: 'ruby'}) { "_id" : ObjectId("4b6f49870476069708965471"), "name" : "moro", "tags" : [ "ruby", "rails" ], "login_count" : { "today" : 5, "total" : 25 } }
Embedded Documentによる検索もできます。キー名を"."で区切って階層を表します。
> db.users.find({'login_count.today': 5}) { "_id" : ObjectId("4b6f49870476069708965471"), "name" : "moro", "tags" : [ "ruby", "rails" ], "login_count" : { "today" : 5, "total" : 25 } }
他にも様々な機能がありますが、
まとめ
今回は、