mongo db勉強会

42
MongoDB勉強会

Upload: otmb

Post on 13-Jul-2015

6.212 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Mongo db勉強会

MongoDB勉強会

Page 2: Mongo db勉強会

MongoDBとは?

Page 3: Mongo db勉強会

ドキュメント指向型データーベース

Page 4: Mongo db勉強会

RDBが関係を格納するのに対し、

ドキュメント指向は、ドキュメントを格納します。

Page 5: Mongo db勉強会

何故ドキュメント指向を使うのか?

Page 6: Mongo db勉強会

背景としては、RDBでは、一般的にスケールアウトが難しい。

今もDBは一台で他を分散化しようという流れがありますよね?

何にでもRDBを使うのではなく、用途に応じて、分散化しやすいKVSやデータストアを利用していこう。

NoSQLを使おうという流れがある。

Page 7: Mongo db勉強会

NoSQLは

既に活用されています

Page 8: Mongo db勉強会

例えば、

Page 9: Mongo db勉強会

Google の BigTable

Page 10: Mongo db勉強会

Amazon の Dynamo

Page 11: Mongo db勉強会

これらはプロプライエタリなデーターベース

Page 12: Mongo db勉強会

では、オープンなドキュメント指向は

何があるか?

Page 13: Mongo db勉強会

CassandraApache License 2.0

Java

Page 14: Mongo db勉強会

CouchDB(カウチDB)Apache License 2.0

Erlang

Page 15: Mongo db勉強会

MongoDBGNU AGPL v3.0

C++

Page 16: Mongo db勉強会

他にも色々

- Chordless- Db4o- GT.M- HBase- Hypertable- Memcachedb- Mnesia- Project Voldemort- Redis- SimpleDB

Page 17: Mongo db勉強会

前置きはこのくらいにして、

Page 18: Mongo db勉強会

操作をしよう。

Page 19: Mongo db勉強会

ユーザーを作成

Page 20: Mongo db勉強会

// 接続$ 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" }

Page 21: Mongo db勉強会

管理ユーザーが作成できれば、

// パスワード設定を行います。$ vi /etc/mongo.confnoauth = falseauth = true

$ /etc/init.d/mongo restart

次に認証の操作。

Page 22: Mongo db勉強会

// 接続$ 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

Page 23: Mongo db勉強会

高度な検索をする際は、以下を参考ください。

http://www.mongodb.org/pages/viewpage.action?pageId=6029357

イコールだと、> db.hoge.find({hoge : 1 })

例えば ne > db.hoge.find({ hoge: { $ne : 1 } })

Page 24: Mongo db勉強会

簡単な操作は以上

次は社内フレームワークDeco

Page 25: Mongo db勉強会

DecoでMongoを実装しました。

Page 26: Mongo db勉強会

なんでMongoDBなの?

Page 27: Mongo db勉強会

理由

Page 28: Mongo db勉強会

PHPから接続できるライブラリが簡単に利用できるのと、記述が簡単

Page 29: Mongo db勉強会

// ライブラリの インストール は一行$ pecl install mongo

// 設定は php.ini に 一行 extension=mongo.so

Page 30: Mongo db勉強会

では、Decoでの初期設定、操作をみていきます。

Page 31: Mongo db勉強会

接続 env.ymldb: dsn: "mongodb://[username]:[password]@localhost/[database]" database: [database]

設定は以上

Page 32: Mongo db勉強会

コードの書き方

// DBのインスタンス作成$hoge = $c->mongo('hoge');

// 結果の配列を受け取る$out = $hoge->findBy($id);

var_dump($out);

Page 33: Mongo db勉強会

以上で、操作出来ます。

次にPHPのライブラリを見ていきます。

Page 34: Mongo db勉強会

MongoDBの コアクラス

Mongo ClassMongoDB ClassMongoCollection ClassMongoCursor Class

コアクラスは4つある。次はクラスの説明。

Page 35: Mongo db勉強会

- Mongo Class MongoDB と PHP を接続

- MongoDB Class Mongo Classのインスタンスを利用した データベースとのやりとり

$m = new Mongo(); // 接続 $db = $m->selectDB("example");

- MongoCollection Class MongoDBのインスタンスを利用した コレクションを操作するクラス

- MongoCursor Class データベースクエリの結果を表すオブジェクト

Page 36: Mongo db勉強会

Decoでの実装では MongoCollection Class をオーバーライドし、インスタンスの結果を返します。

Page 37: Mongo db勉強会

何が嬉しいか?MongoCollectionのメソッドを自由に変更できる。

Page 38: Mongo db勉強会

また、plugin/mongo/[collection].php を用意することで、コレクション毎に、MongoCommon をオーバーライドする実装としました。

Page 39: Mongo db勉強会

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); }

Page 40: Mongo db勉強会

クラスのイメージ

plugin/mongo/MongoCommon.php

class MongoCommon extends MongoCollection {

}

plugin/mongo/[collection].php // location.php

class P_mongo_location extends MongoCommon {

}

Page 41: Mongo db勉強会

つまり、メソッドの 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'; }}

Page 42: Mongo db勉強会

実装は以上です。

あとは、Decoでの操作を見ながら確認していきます。