thinkphp5.1中mongodb的使用測試
阿新 • • 發佈:2018-12-24
環境:lnmp
框架:thinkphp5.1
資料庫配置檔案:
<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <
[email protected]> // +---------------------------------------------------------------------- return [ // 資料庫型別 'type' => '\think\mongo\Connection', // 伺服器地址 'hostname' => '127.0.0.1', // 資料庫名 'database' => 'mytest', // 使用者名稱 'username' => '', // 密碼 'password' => '', // 埠 'hostport' => '', // 連線dsn 'dsn' => '', // 資料庫連線引數 'params' => [], // 資料庫編碼預設採用utf8 'charset' => 'utf8', // 資料庫表字首 'prefix' => '', // 資料庫除錯模式 'debug' => true, // 資料庫部署方式:0 集中式(單一伺服器),1 分散式(主從伺服器) 'deploy' => 0, // 資料庫讀寫是否分離 主從式有效 'rw_separate' => false, // 讀寫分離後 主伺服器數量 'master_num' => 1, // 指定從伺服器序號 'slave_no' => '', // 是否嚴格檢查欄位是否存在 'fields_strict' => true, // 資料集返回型別 'resultset_type' => 'array', // 自動寫入時間戳欄位 'auto_timestamp' => false, // 時間欄位取出後的預設時間格式 'datetime_format' => 'Y-m-d H:i:s', // 是否需要進行SQL效能分析 'sql_explain' => false, // Query類 'query' => '\think\mongo\Query', // 'pk_convert_id' => true, ];
控制器程式碼:
<?php /** * Class Test * decription tp5中mongodb操作測試類 * author mn * version 1.0 * date 2018/3/5 */ namespace app\index\controller; use think\Controller; use app\index\model\user; use app\index\model\info; class Test extends Controller { //新增資料測試 可直接使用tp的方法新增資料,但是一次只能插入一條資料(很奇怪,感覺應該是bug,所以在後邊寫了批量插入的方法)。 public function add(){ $model = new user; $uid = $model->seq(); var_dump($model->add(['uid'=>$uid,'name'=>'asdfasf','arr'=>[['a'=>'aaa','b'=>'bbb']]])); } //批量插入測試 public function insertMany(){ $model = new user; $data = []; $arr = []; for($i=0;$i<3;$i++){ $uid = $model->seq(); $data[] = ['uid'=>$uid,'name'=>'name'.$i,'age'=>10+$i,'addr'=>'嘰裡呱啦'.$i,'arr'=>[ ['class'=>'class'.$i,'level'=>$i+2,'common'=>'abcd'.$i], ['class'=>'class'.($i+1),'level'=>$i+3,'common'=>'abcd'.($i+1)], ['class'=>'class'.($i+2),'level'=>$i+2,'common'=>'abcd'.($i+2)] ]]; } var_dump($model->insertMany($data)); } //批量插入測試 public function insertInfo(){ // phpinfo();die; $model = new info; $arr = []; for($i=0;$i<10;$i++){ $arr[] = ['uid'=>$i+1,'money'=>1000+$i,'bank'=>'beijing'.$i,'photo'=>'/public/photo/'.$i]; } var_dump($model->insertMany($arr)); } //查詢測試 經測試,tp的鏈式查詢完美支援mongodb public function getList(){ $model = new user; // $list = $model->pageList([['age','>',11]],['uid'=>-1],2,3); $list = $model->pageList([['uid','=',11],['arr.level','=',3]],['uid'=>-1],0,5); var_dump($list); } //修改測試 支援普通修改,支援對陣列中的文件進行 $ 更新操作 public function update(){ $model = new user; $data = ['arr.$.a'=>'class11111']; $where = [['uid','=',11]]; $res = $model->updateU($data,$where); var_dump($res); } //修改測試,針對陣列中的文件進行$push $pull操作,完美支援 public function updateO(){ $model = new user; // $data = ['arr'=>['$pull',['a'=>'aaa1']]]; $data = ['arr'=>['$push',['a'=>'aaa1','b'=>'bbb1']]]; $where = [['uid','=',11]]; $res = $model->updateU($data,$where); var_dump($res); } }
資料庫模型類:
<?php
/**
* Class user
* decription user表模型類
* author mn
* version 1.0
* date 2018/3/5
*/
namespace app\index\model;
use think\Exception;
use think\Model;
use MongoDB\Driver\Command;
use MongoDB\Driver\BulkWrite;
class user extends Model
{
protected $table = 'user';
public function __construct($data = [])
{
parent::__construct($data);
}
/*
public function info(){
return $this->hasOne('info','uid');
}
public function setEagerlyType(){
return 0;
}
public function testRelation(){
return $this->where([['uid','=',1]])->info()->select();
}*/
//新增
public function add($data)
{
return $this->save($data);
}
//更新
public function updateU($data,$where=[]){
return $this->save($data,$where);
}
//批量插入
public function insertMany($data){
try{
$bulkObj = new BulkWrite();
foreach($data as $k=>$v){
$bulkObj->insert($v);
}
$this->execute($this->table,$bulkObj);
return true;
}catch(Exception $e){
var_dump($e->getMessage());
return false;
}
}
//查詢操作
public function pageList($where,$order,$skip,$limit){
$list = $this->where($where)->order($order)->limit($skip,$limit)->select();
return $list;
}
/*
* 關聯查詢加分頁 (tp5目前不支援mongodb使用join等鏈式方式進行關聯查詢,包括框架中的關聯模型好像也不支援mongodb,所以這裡只能通過原生的方法實現表的關聯查詢)
*@param $lookup array 關聯表資訊 如:'$lookup'=>[
'from'=>'info', 關聯表
'localField'=>'uid', 主表關聯欄位
'foreignField'=>'uid', 副表關聯欄位
'as'=>'joinData', 資料集名稱
],
*@param $where array 條件
*@param $sort array 排序
*@param $skip int 跳過條數
*@param $limit int 限制條數
* */
public function joinSelect($lookup,$where,$sort,$skip,$limit)
{
$cmd = [
'aggregate'=>$this->table,
'pipeline'=>[
[
'$lookup'=>$lookup,
],
[
'$match'=>$where,
],
[
'$sort'=>$sort,
],
[
'$skip'=>$skip,
],
[
'$limit'=>$limit,
],
],
'explain'=>false,
];
$cmdObj = new Command($cmd);
$res = $this->command($cmdObj);
return $res;
}
/*
* group分組查詢 (tp5同樣不支援group鏈式操作,此處還是使用原生查詢)
* @param array $group 分組規則 如:'$group'=>[
'_id'=>['sex'=>'$sex'], //分組條件
'ageSum'=>['$sum'=>'$age'], //要得到的聚合資料
]
*
*
* */
public function groupSelect($group){
$cmd = [
'aggregate'=>$this->table,
'pipeline'=>[
[
'$group'=>$group,
],
],
'explain'=>false,
];
$cmdObj = new Command($cmd);
$res = $this->command($cmdObj);
return $res;
}
//獲取自增id (mongodb中沒有類似MySQL中的自增ID,需要自己實現,這裡通過一個集合來維護所有的自增ID)
public function seq($id = 'uid'){
$cmd = array(
'findandmodify' => 'sequences',
'query' => array('_id' => $id),
'update' => array('$inc' => array('val' => 1)), //更新
'new' => true,
'upsert' => true
);
$cmdObj = new Command($cmd);
$res = $this->command($cmdObj);
return $res[0]['value']['val'];
}
}