Mongo db勉強会
Transcript of Mongo db勉強会
MongoDB勉強会
MongoDBとは?
ドキュメント指向型データーベース
RDBが関係を格納するのに対し、
ドキュメント指向は、ドキュメントを格納します。
何故ドキュメント指向を使うのか?
背景としては、RDBでは、一般的にスケールアウトが難しい。
今もDBは一台で他を分散化しようという流れがありますよね?
何にでもRDBを使うのではなく、用途に応じて、分散化しやすいKVSやデータストアを利用していこう。
NoSQLを使おうという流れがある。
NoSQLは
既に活用されています
例えば、
Google の BigTable
Amazon の Dynamo
これらはプロプライエタリなデーターベース
では、オープンなドキュメント指向は
何があるか?
CassandraApache License 2.0
Java
CouchDB(カウチDB)Apache License 2.0
Erlang
MongoDBGNU 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.confnoauth = falseauth = 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.ymldb: dsn: "mongodb://[username]:[password]@localhost/[database]" database: [database]
設定は以上
コードの書き方
// DBのインスタンス作成$hoge = $c->mongo('hoge');
// 結果の配列を受け取る$out = $hoge->findBy($id);
var_dump($out);
以上で、操作出来ます。
次にPHPのライブラリを見ていきます。
MongoDBの コアクラス
Mongo ClassMongoDB ClassMongoCollection ClassMongoCursor 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.phpplugin/mongo/MongoCommon.phpplugin/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での操作を見ながら確認していきます。