1. 程式人生 > >ThinkPHP支援MongoDb Aggregate方法聚合管道

ThinkPHP支援MongoDb Aggregate方法聚合管道

預設的Thinkphp是不支援aggregate聚合的,在使用Mongodb的時候,難免會出現分組等一些複雜的操作,不然的話操作相對很繁瑣。本文介紹下對Thinkphp中MongoModel.class.php和Mongo.class.php的修改使mongo模型支援管道聚合。

1.在ThinkPHP/Library/Think/Model/MongoModel.class.php檔案中的group方法之後加入以下程式碼
/**
     * 聚合介面
     * @access public
     * @return string
     */
    public function aggregate
($pipeline, $option=array()) { $option = $this->_parseOptions($option); return $this->db->aggregate($pipeline, $option); }
2.在ThinkPHP/Library/Think/Db/Driver/Mongo.class.php檔案中的group方法之後加入以下程式碼
//聚合介面
    public function aggregate($pipeline,$options=array()){
        if(isset
($options['table']) && $this->_collectionName != $options['table']) { $this->switchCollection($options['table'],'',false); } $this->model = $options['model']; $this->queryTimes++; N('db_query',1); // 相容程式碼 if($this->config['debug'
]) { $this->queryStr = $this->_dbName.'.'.$this->_collectionName.'.aggregate('.json_encode($pipeline).')'; } try{ $this->debug(true); $option = array(); if(isset($options['allowDiskUse'])) { $option['allowDiskUse'] = $options['allowDiskUse']; } if(isset($options['cursor'])) { $option['cursor'] = $options['cursor']; } if(isset($options['explain'])) { $option['explain'] = $options['explain']; } if(isset($options['maxTimeMS'])) { $option['maxTimeMS'] = $options['maxTimeMS']; } $aggregate = $this->_collection->aggregate($pipeline,$option); $this->debug(false); return $aggregate; } catch (\MongoCursorException $e) { E($e->getMessage()); } }
在這兩個地方修改後就可以支援了。
ThinkPHP版本:3.2.3完整版

ThinkPHP連線Mongodb問題發現:
1.提示什麼多了個[,後來發現是本機PHP版本不夠高,不支援框架中的語法,找到位置修改後就行了。

2.Mongodb使用者和密碼問題。建立的使用者和密碼需要在ThinkPHP配置檔案所指定的你需要連線庫中,不然連不上。
因為連線的時候php會在這個庫下的system.users集合中去找使用者名稱和密碼。
具體做法是在Mongo命令列建立使用者的時候,先切換到我們需要的庫,然後再建立使用者。