1. 程式人生 > >thinkphp5.1中mongodb的使用測試

thinkphp5.1中mongodb的使用測試

環境: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'];
    }
}