PHP yii 從mysql改成mongodb過程XD



一開始想說用yii人家寫好的mongodb套件

http://www.yiiframework.com/extension/mongoyii/

弄弄好之後 run run看

還不錯說~~~

撈資料跟寫入資料寫法都跟原本yii的寫法差不多

酷酷der

而且新增Model只要簡單建立一個class並繼承他的寫好的class即可

方便便der

可是後來我發現一個很大的問題..........

就是...........慢到靠杯0rz|||||||||||

真的慢到爆......

我猜應該是裡面哪邊沒寫好.....我猜der

所以情非得已之下只好...用他原生的MongoClient等等寫法去寫

雖然速度真的很快

但就是不方便寫0rz


為了開發上的方便

我自己寫了幾個function 為了方便開發寫的

我把function弄成像yii的Model寫法

yii原本寫法可能是User::model()->find($criteria)

我自己寫的是User()->find($c);

其實User()這個function就像那個Model

function User() {
    return $GLOBALS['mongoClient'] -> selectCollection('xxxxxx', 'user');
}

這是我自己想出來der

一方面很像yii原本的寫法 一方面加快開發速度0rz

然後簡單寫了update跟findByID的function

主要因為MongoDB在update跟findOne的時候需要包個MongoId物件....每次都這樣寫會煩死

所以我把這兩個麻煩的function寫成通用 方便我開發用的function

 function update($collection, $data) {
    $_id = (string)$data['_id'];
    unset($data['_id']);
    $newdata = array('$set' => $data);
    return $collection -> update(array("_id" => new MongoId($_id)), $newdata);
}

function findByID($collection, $_id) {
    return $collection -> findOne(array('_id' => new MongoId($_id)));
}


其實在yii我覺得寫在Controller的一個function感覺比較好說

但是實在懶得每次都在$this->xxxxx(blabalblabllba)

所以我把她寫成function~XD


改裝過程學到很多東西0rz

像是enum都寫成1,2,3,4,5,789

mysql是可以設定enum......小方便

不過mongodb這邊聽朋友說應該寫1234然後程式要記錄這些type的id是啥啥啥

也學到很多他的查詢寫法

最酷的是他的查詢與法就像在寫程式

即使是寫多重條件搜尋也只要條件成立把她塞進一個array即可

if (isset($search['brandID']) && !empty($search['brandID'])) {
$c['brandID'] = intval($search['brandID']);
}

$items = Sell() -> find($c) -> skip($skip) -> limit($itemPerPage);

超方便0rz

雖然yii本身的ctiteria概念有種東西叫addCondition

然後很不習慣的是他的PK是一長串~~~雖然這樣似乎也比較好0rz


改裝過程大致就是

先寫程式作資料轉換到mongoDB

然後再寫一些方便自己開發好用的function~~雖然其實是一邊寫一邊思考才變出這幾個function的XD

然後在一邊run網站 一邊到每隻程式進去改寫法

總之是個不簡單的工程0rz

不過有了這經驗

下次遇到啥網站有這種需求的

我一定可以改更快A0A

沒有留言: