第1回目となる今回は、
NoSQLへの流れ
過去20年間でCPUの処理能力は数十倍になり、
RDBでは、

NoSQLの分類
現在NoSQLと呼ばれているものは、

- 1.KVS
(Key-Value Store) - データをKeyとValueのHash形式で持つ
- 基本的にはKeyでの完全一致検索でしかデータを取得できないが、
高速に動作する - 代表的なプロダクト:Memcached、
Redisなど
- 2.ドキュメント指向データベース
- スキーマを定義しなくても使用できるスキーマレスである
- 複雑な検索条件でデータを取得することが可能
- 代表的なプロダクト:MongoDB、
CouchDBなど
- 3.列指向データベース
- RDBのような行単位ではなく、
列単位での処理に特化している - 代表的なプロダクト:Cassandra、
HBaseなど
- RDBのような行単位ではなく、
この連載ではNoSQLのひとつでありドキュメント指向データベースに分類されるMongoDBについて紹介していきます。
MongoDBが目指すもの
MongoDBは、
RDBと比較してMongoDBが実装しなかった機能は、
- ※ ただし、
1つのドキュメントに対するAtomicな操作はサポートしています。
次にKVSと比較してMongoDBが備えている機能です。代表的なものに"RDBライクな検索クエリ"があります。memcachedなどに代表されるKVSは、
上記の機能に加えて、
このように、

MongoDBの思想
MongoDBの思想を紹介するため、
MongoDBは研究室の中で設計されたわけではありません。私たちは、
大きなスケールの、 高可用性を備えた、 堅牢なシステムを構築した経験をもとにMongoDBを作りました。ゼロからはじめたわけではありません。何が壊れているのかを見つけ出し、 それに取り組むという方法を取ってきました。 私はMongoDBについて、
次のように考えています。もしMySQLのデータモデルをリレーショナルベースのものからドキュメントベースのものへ変更したら、 管理が容易な高速な埋め込みドキュメントや、 スキーマレスデータベースやアジャイル開発手法、 ジョインが重要でなくなることによって容易になるスケールアウトなど、 たくさんの素晴らしい機能を得るでしょう。 リレーショナルデータベースには、
素晴らしい機能がたくさんあります。インデックスや、 ダイナミッククエリや、 アップデート機能など、 枚挙に暇がありません。私たちはそこは大きく変えないようにしました。たとえば、 MongoDBでインデックスを設計するときの手法は、 MySqlやOracleでの手法と全く同じです。単に、 埋め込みフィールドにインデックスを張るという新しい選択肢が与えられるのです。
MongoDBはこのような思想に基づき、
MongoDBの特徴
MongoDBの特徴として、
- スキーマレスであるドキュメント指向データべースであること
- データはスキーマレスなドキュメントで格納され、
任意のフィールドを好きなときに追加できる - KVSでは苦手なValueを検索の条件としたり、
ソート・ 集計を実現できる
- データはスキーマレスなドキュメントで格納され、
- スケーラビリティに関する機能を標準機能として備えていること
- レプリケーション機能、
オートフェールオーバー機能を備えている (Replica Sets) - レンジパーティション機能、
オートバランシング機能を備えている (Sharding)
- レプリケーション機能、
- RDBと比較してRead/
Writeの性能が高い - トランザクション・
リレーションを制限した結果、 KVSに近いパフォーマンスを出せる
- トランザクション・
- 開発のしやすさ
- どのような環境でもパフォーマンスが出るように、
ネイティブソケットプロトコルを使用したドライバを主要なプログラミング言語で開発元が提供している - RESTインターフェイスを標準で備えており、
Webで広く普及しているJSONを使用してデータ送受信ができる
- どのような環境でもパフォーマンスが出るように、
このような特徴があるMongoDBは、
MongoDBの使いどころ
MongoDBは先ほど紹介した特徴から、
Webサイトの操作データログの蓄積
MongoDBをログストアにする事例はすでにWeb上に多く見られます。データサイズの制限があるコレクションであるCapped Collectionや一定期間が経過すると削除されるTTL Collectionといった機能が活用されています。またアプリによって出力フォーマットが違うログを一括して扱う場合、
アドホックなフィールドを検索対象とするようなコンテンツ
たとえば、
ソーシャルゲーム
軽いRead/
逆に以下のケースで適用したいというなら、
銀行や会計システムのような、複雑なトランザクションに重きを置くシステム
複数のトランザクションを必要としたクエリが必要になる場合、
レガシーな夜間バッチの負荷がかかるビジネスインテリジェンスシステム
MongoDBはバッチ処理が不可能でこそないですが、
SQLを必須としているシステム
MongoDBはSQLをサポートしていません。
それでは次に、
MongoDBのインストール
MongoDBのインストールは非常に簡単です。以下の4つのステップで起動できます。
- MongoDBのバイナリダウンロード
- ダウンロードしたファイルの展開
- データディレクトリの作成
- MongoDBの起動
MongoDBのバイナリダウンロード
まずMongoDBをダウンロードします。MongoDBダウンロードページからそれぞれのプラットフォームに合ったものをダウンロードしてください。
注意:MongoDB2.
本記事ではversion 2.
ダウンロードしたファイルの展開
ダウンロードしたファイルはzipやtar.
展開したMongoDBのディレクトリは以下のようになっています。
(展開したディレクトリ)
|--bin
| |--mongod.exe : MongoDBの本体です。
| |--mongo.exe : MongoDBのクライアントです。
| ..
|--GNU-AGPL-3.0
|--README
..
※ Windowsの場合です。Linux
データディレクトリ作成
データの格納に使うディレクトリを作成します。コマンドプロンプト
mkdir C:\data\db
mkdir -p /data/db
MongoDBの起動
展開したMongoDBのディレクトリにあるMongoDBの本体
cd (展開したディレクトリ) bin\mongod.exe
cd (展開したディレクトリ) ./bin/mongod
起動したコンソールの最後に
MongoDBに触ってみる
MongoDBクライアントでMongoDBのコンソールに接続する
新しくコマンドプロンプト
cd (展開したディレクトリ) bin\mongo.exe
cd (展開したディレクトリ) ./bin/mongo
以下のように入力待ちの状態になれば接続できています。
MongoDB shell version: 2.2.1 connecting to: test > ←入力待ち
MongoDBのデータ構造
データを挿入する前に、
--MongoDB
+--データベース
| +--コレクション
| | +--ドキュメント
| | +--ドキュメント
| |
| +--コレクション
| | +--ドキュメント
|
+--データベース
| +--コレクション
ですので、
データベースの作成
MongoDBのコンソールに接続した状態で、
> use testdb switched to db testdb
ドキュメントの挿入
コレクションを指定して、
> db.testcoll.insert( { "key1" : "string", "key2" : 123 } )
何のエラーも表示されなければ成功しています。
普通のリレーショナルデータベースに対する挿入とはかなり異なると思うので、
まず、
次に、
もう1つドキュメントを投入してみましょう。次に投入するデータはハッシュだけではなく、
> db.testcoll.insert( { "array" : [ "sun", "mon" , "tue" ] } )
MongoDBはスキーマレスですので、
ドキュメントの参照
ドキュメントの参照はコレクションのfind()メソッドを使います。以下のコマンドを実行してください。
> db.testcoll.find() { "_id" : ObjectId("509f41b38626d09726e978ed"), "key1" : "string", "key2" : 123 } { "_id" : ObjectId("509f41ba8626d09726e978ee"), "array" : [ "sun", "mon", "tue" ] }
このように先ほど挿入したドキュメントが表示されます。また、
findOne()のメソッドで、
> db.testcoll.findOne() { "_id" : ObjectId("509f41b38626d09726e978ed"), "key1" : "string", "key2" : 123 }
ドキュメントに対して、
> db.testcoll.findOne()["key1"] string
この文法はJavaScriptと同じです。実はMongoDBはJavaScriptの実行環境を備えているため、
今回はここまでとします。