mongo db勉強会

Post on 13-Jul-2015

6.212 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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での操作を見ながら確認していきます。

top related