环境: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 <liu21st@gmail.com>
// +----------------------------------------------------------------------
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'];
}
}