MongoDB 勉強会
MongoDB とは?
ドキュメント指向型 データーベース
RDB が関係を格納するのに対し、 ドキュメント指向は、 ドキュメントを格納します。
何故ドキュメント指向を使うのか?
背景としては、 RDB では、 一般的にスケールアウトが難しい。 今も DB は一台で他を 分散化しようという流れがありますよね? 何にでも RDB を使うのではなく、 用途に応じて、分散化しやすい KVS やデータストアを利用していこう。 NoSQL を使おうという流れがある。
NoSQL は 既に活用されています
例えば、
Google  の  BigTable
Amazon  の  Dynamo
これらはプロプライエタリな データーベース
では、オープンな ドキュメント指向は 何があるか?
Cassandra Apache License 2.0 Java
CouchDB( カウチ DB) Apache License 2.0 Erlang
MongoDB GNU AGPL v3.0 C++
他にも色々 - Chordless - Db4o - GT.M - HBase - Hypertable - Memcachedb - Mnesia - Project Voldemort - Redis - SimpleDB
前置きはこのくらいにして、
操作をしよう。
ユーザーを作成
//  接続 $ mongo > //  予約語として管理 DB があります。 > use admin //  現在はユーザーがいません。 > db.system.users.find() //  ユーザーを作成します。 > db.addUser('root','password') { "_id" : ObjectId("4ce0d5d806d4bbe3c620c5a4"), "user" : "root", "readOnly" : false, "pwd" : "d60e7db4538202339acd585fa951c5aa" } //  ユーザーを確認 > db.system.users.find() { "_id" : ObjectId("4ce0d5d806d4bbe3c620c5a4"),  "user" : "root",  "readOnly" : false,  "pwd" : "d60e7db4538202339acd585fa951c5aa" }
管理ユーザーが作成できれば、 //  パスワード設定を行います。 $ vi /etc/mongo.conf noauth = false auth = true $ /etc/init.d/mongo restart 次に認証の操作。
//  接続 $ mongo > > use admin // DB の一覧を求めます。 Error を返します。 > show dbs //  認証します。 > db.auth('root','password') 1 // DB の一覧が見れるようになりました > show dbs //  データーを登録します。 // use  で  DB を指定(作成 ) > use test //  コレクションを指定してデーターを登録することで、コレクション ( テーブル ) が出来ます。 > db.hoge.insert({hoge: 1}) > db.hoge.find() //  コレクションの一覧確認 > show collections
高度な検索をする際は、以下を参考ください。 http://www.mongodb.org/pages/viewpage.action?pageId=6029357 イコールだと、 > db.hoge.find({hoge : 1 })  例えば  ne  > db.hoge.find({ hoge: { $ne : 1 } })
簡単な操作は以上 次は社内フレームワーク Deco
Deco で Mongo を 実装しました。
なんで MongoDB なの?
理由
PHP から接続できるライブラリが 簡単に利用できるのと、記述が簡単
//  ライブラリの インストール は一行 $ pecl install mongo //  設定は  php.ini  に 一行  extension=mongo.so
では、 Deco での初期設定、 操作をみていきます。
接続  env.yml db: dsn: "mongodb://[username]:[password]@localhost/[database]" database: [database] 設定は以上
コードの書き方 // DB のインスタンス作成 $hoge = $c->mongo('hoge'); //  結果の配列を受け取る $out = $hoge->findBy($id); var_dump($out);
以上で、操作出来ます。 次に PHP のライブラリを見ていきます。
MongoDB の コアクラス Mongo Class MongoDB Class MongoCollection Class MongoCursor Class コアクラスは4つある。 次はクラスの説明。
- Mongo Class MongoDB  と  PHP  を接続 - MongoDB Class  Mongo Class のインスタンスを利用した データベースとのやりとり $m = new Mongo(); //  接続 $db = $m->selectDB("example"); - MongoCollection Class MongoDB のインスタンスを利用した コレクションを操作するクラス - MongoCursor Class データベースクエリの結果を表すオブジェクト
Deco での実装では  MongoCollection Class  を オーバーライドし、 インスタンスの結果を返します。
何が嬉しいか? MongoCollection の メソッドを自由に変更できる。
また、 plugin/mongo/[collection].php  を用意することで、 コレクション毎に、 MongoCommon  を オーバーライドする実装としました。
Deco Mongo パッケージ構成 plugin/mongo.php plugin/mongo/MongoCommon.php plugin/mongo/[collection].php + Deco.php  に  function  追加 // mongoDB function & mongo($table){ $db = $this->plugin('mongo', 1); return $db->getMongo($table); }
クラスのイメージ plugin/mongo/MongoCommon.php class MongoCommon extends MongoCollection { } plugin/mongo/[collection].php // location.php class P_mongo_location extends MongoCommon { }
つまり、メソッドの  MongoCommon  の  find  メソッドに対し、 P_mongo_location  に  find  を実装することで、 処理の上書きができます。 plugin/mongo/MongoCommon.php class MongoCommon extends MongoCollection { function find($query = array()){ return parent::find($query); } } plugin/mongo/[collection].php class P_mongo_location extends MongoCommon { function find($query = array()){ // ←  が優先となる。 return 'hoge'; } }
実装は以上です。 あとは、 Deco での操作を見ながら 確認していきます。

Mongo db勉強会