ThinkPHP支援MongoDb Aggregate方法聚合管道
阿新 • • 發佈:2018-12-24
預設的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命令列建立使用者的時候,先切換到我們需要的庫,然後再建立使用者。