MongoDBをCakePHPから使う

mongoDB

■MongoDBとは

ドキュメントベースのデータベースです。NoSQLの一種だと思います。JSON的なデータ構造で情報を保持されるようです。その中身を高速に検索することも可能です。これをmysqlでやろうとすると、like検索の前後一致をする必要があり、非常に遅くなってしまいます。

■CakePHPで利用する準備

今回はCakePHPからMongoDBを使ってみます。デフォルトだと、CakePHPはMongoDBに対応していないので、プラグインを導入して対応します。

GitHub - ichikaway/cakephp-mongodb: [Abandon Project] MongoDB database driver for CakePHP
MongoDB database driver for CakePHP - ichikaway/cakephp-mongodb

こちらから、プラグインをダウンロードして、

Mongodb

というディレクトリ名でpluginsディレクトリへ入れます。

■設定ファイルの変更

プラグインを導入したら利用できるようにします。

bootstrap.php

CakePlugin::load('Mongodb');

database.php

public $default_mongo = array(
    'datasource' => 'Mongodb.MongodbSource',
    'host' => 'localhost',
    'database' => 'testdb',
    'port' => '27017',
    'encoding' => 'utf8',
);

さらに、私はAppModelを継承した基底クラスを作りました。MongoDBを利用するモデルはこのクラスを継承すれば、自動的にMongoDBに接続されるようになります。

<?php

/**
* MongoDBを使うときに利用する基底モデル。
*/
class AppMongoModel extends AppModel {

	// DB接続設定をMongoDBに切り替え
	var $useDbConfig = 'default_mongo';

	// ORマッパーを使えるように変更
	var $actsAs = array(
		'Mongodb.SqlCompatible'
	);
}

 

■使い方

以下のようにモデルを記述します。いつもと同じようにfindやsaveをすることができます。Paginateなども利用することができるので、非常に便利です。

<?php

/**
*MongoDBのテストクラス
*
*/

App::uses('AppMongoModel', 'Model');

class MongoTest extends AppMongoModel {

	/**
	* 引数で指定したIDの情報を取得する。
	*/
	public function getInfo($id) {

		$conditions = array(
			'conditions' => array(
				'_id' => $id,
			),
		);

		$testInfo = $this->find('first', $conditions);
		return $testInfo;
	}
}