laravel框架 mongo使用
前置条件: PHP本地安装mongodb扩展
laravel框架中使用mongodb, 需要使用Jenssegers的MongoDB包
1.引入MongoDB
composer require jenssegers/mongodb
安装完成后, laravel会自动加载MongoDB服务提供者
2.配置数据库连接
在config/database.php配置mongo并返回
$mongoDB = [
'driver' => 'mongodb',
'host' => env('DB_MG_HOST', 'localhost'),
'port' => env('DB_MG_PORT', 27017),
'database' => env('DB_MG_DATABASE'),
'username' => env('DB_MG_USERNAME'),
'password' => env('DB_MG_PASSWORD'),
'options' => [
'database' => 'admin'
],
];
'mongodb' => array_merge($mongoDB, ['database' => env('DB_MG_DATABASE')]),
在connections返回mongodb
3.使用MongoDB
在使用上可以通过DB方式指定连接及数据集合, 或是通过laravel模型的方式
1.DB
# 插入
DB::connection("mongodb") // 指定连接mongodb
->collection("user_extend") // 指定集合
->insert([
"name" => "张三",
"mobile" => 15812345678,
]);
这里指定的mongodb就是在database文件配置的connections.mongodb
# 查询
// 获取所有符合条件的数据
DB::connection("mongodb")->collection("user_extend")->get();
// 满足条件的第一条
DB::connection("mongodb")->collection("user_extend")->where("mobile", 15812345678)->first();
#编辑
DB::connection("mongodb")->collection("user_extend")->where("mobile", 15812345678)->update(["state" => 1]);
#删除
DB::connection("mongodb")->collection("user_extend")->where("mobile", 15812345678)->delete();
2.模型
1.创建user_extend的mongo模型
<?php
namespace App\Models\mongo;
use Jenssegers\Mongodb\Eloquent\Model;
class UserExtend extends Model
{
protected $connection = 'mongodb'; // 指定连接
protected $collection = 'user_extend'; // 指定集合
protected $primaryKey = '_id';
protected $guarded = []; // 在create方法不能被赋值的字段
}
2.模型操作数据
# 新增
$userExtend = new UserExtend([
"name" => "李四",
"mobile" => 13312345678,
]);
$userExtend->save();
#模型插入
UserExtend::query()->insert(["name" => "李2", "mobile" => 15512345678]);
#查询
UserExtend::query()->where("mobile", 15512345678)->first(); // 满足条件的第一条
UserExtend::query()->where("mobile", 15512345678)->get(); // 获取所有符合条件的数据
#编辑
// 查询一条数据, 赋值后保存
$first = UserExtend::query()->where("mobile", 15512345678)->first();
$first->fill(["state" => 1])->save();
// 按条件更新
UserExtend::query()->where("mobile", 15512345678)->update(["state" => 1]);
#删除
UserExtend::query()->where("mobile", 15512345678)->delete();
#mongodb查询时, 需要注意数据类型一致
4.mongo聚合
示例: 统计状态启用18-36岁的用户, 按性别及爱好分组, 统计人数及用户开销
// 统计状态启用18-36岁的用户, 按性别及爱好分组, 统计人数及用户开销
$list = UserExtend::query()->raw(function ($q) {
$match = [
"state" => 1,
"age" => [
'$gte' => 18,
'$lte' => 36,
],
];
$groupBy = [
"habit" => '$habit',
"sex" => '$sex',
];
$aggregate[]['$match'] = $match;
$aggregate[]['$group'] = [
'_id' => $groupBy,
'habit' => ['$first' => '$habit'], // 爱好分组
'sex' => ['$first' => '$sex'], // 年龄
'count' => ['$sum' => 1], // 用户开销
'overhead_total' => ['$sum' => '$overhead_amount'], // 用户开销
];
return $q->aggregate($aggregate);
});