推荐组件:composer require jenssegers/mongodb
注册服务:Jenssegers\Mongodb\MongodbServiceProvider::class,
添加Facades : 'Mongo' => Jenssegers\Mongodb\MongodbServiceProvider::class,
修改数据库配置文件 config/database.php 中
添加 MongoDB 的数据库的信息:
'mongodb' => [
'driver' => 'mongodb',
'host' => 'localhost',
'port' => 27017,
'database' => 'mydb',
'username' => '',
'password' => '',
],
'default' => env('DB_CONNECTION', 'mysql'),
改成:
'default' => env('DB_CONNECTION', 'mongodb'),
使用方法:
/**
* Redis
*/
namespace App\Models;
use Illuminate\Support\Facades\DB;
class Mongodb
{
/**
* 使用此数据库配置
*/
protected static $connection = 'mongodb';
/**
* 写入数据
*/
public static function insert($table,$data){
return DB::connection(static::$connection)->collection($table)->insert($data);
}
public static function delete($table,$where){
return DB::connection(static::$connection)->collection($table)->where($where)->delete();
}
public static function update($table,$where,$update){
return DB::connection(static::$connection)->collection($table)->where($where)->update($update);
}
/**
* 追加更新
*/
public static function pushArr($table,$where,$field,$update){
return DB::connection(static::$connection)->collection($table)->where($where)->push($field,$update);
}
/**
* 分页查询
*/
public static function paginate($table,$whereField=[],$where=[],$page=1,$pageSize=10,$orderBy=[]){
$collection= DB::connection(static::$connection)->collection($table);
if($where){
$collection= $collection->where($where);
}
if($whereField){
$collection= $collection->select($whereField);
}
$count= $collection->count();
$list= [];
if( $count> 0 ){
if($orderBy){
foreach($orderBy as $field=>$sort){
$collection= $collection->orderBy($field, $sort);
}
}
$offset= $pageSize*($page-1);
$collection= $collection->offset($offset)->limit($pageSize)->get();
foreach($collectionas $record){
$list[]= $record;
}
}
return [ 'count'=> $count, 'list'=> $list];
}
/**
* 查询
* @param $table
* @param array $where
* @param array $orderBy
* @return array[]
*/
public static function getDataAll($table,$field=[],$where=[],$orderBy=[]){
$collection= DB::connection(static::$connection)->collection($table);
$list= [];
if($field){
$collection= $collection->select($field);
}
if($where){
$collection= $collection->where($where);
}
if($orderBy){
foreach($orderBy as $field=>$sort){
$collection= $collection->orderBy($field, $sort);
}
}
$collection= $collection->get();
foreach($collectionas $record){
$list[]= $record;
}
return $list;
}
}
特别操作:
超时
要防止MongoCursorTimeout异常,您可以手动设置将应用于游标的超时值:
DB::collection('users')->timeout(-1)->get();
Upsert是一种特殊的更新方式,要是没有找到符合条件的文档,则会自动创建一个文档,否则更新对应的文档数据。
看 mongodb权威指南提到 upsert会避免竞态问题,如果使用日常的思维去考虑这个问题,需要先去数据库中查找符合条件的文档,然后再根据更新信息更新数据,这个在多线程或者多进程的情况下产生资源竞争的情况,使用 upsert可以很好的避免这种情况的发
DB::collection('users')->where('name', 'John')->update($data, ['upsert' => true]);
Projections(投影文档)
您可以使用项目方法将投影应用于查询。
value字段的取值为0或者false时,表示要在返回结果中去除该字段;如果value字段取值为1或者true,表示在返回结果中需要包含这个字段。
查询结构只展示title和likes
$project = ['title'=>1,'likes'=>1,"_id"=>0];
DB::collection('users')->project($project)->get();
DB::collection('items')->project(['tags' => ['$slice' => 1]])->get();
DB::collection('items')->project(['tags' => ['$slice' => [3, 7]]])->get();
分页使用
$limit = 25;
$projections = ['id', 'name'];
DB::collection('items')->paginate($limit, $projections);
Push(更新数组$push操作符)
$push操作符添加指定的值到数组中,$push操作符有如下的格式:
DB::collection('users')->where('name', 'John')->push('items', 'boots');
DB::collection('users')->where('name', 'John')->push('messages', ['from' => 'Jane Doe', 'message' => 'Hi John']);
如果您不想要重复项,请将第三个参数设置为true:
DB::collection('users')->where('name', 'John')->push('items', 'boots', true);
Pull(更新数组$pull修饰符)
$pull修饰符会删除掉数组中符合条件的元素
DB::collection('users')->where('name', 'John')->pull('items', 'boots');
DB::collection('users')->where('name', 'John')->pull('messages', ['from' => 'Jane Doe', 'message' => 'Hi John']);
Unset(删除一个指定的字段)
如果指定的字段不存在则操作不做任何处理;
当使用$操作符匹配任何数组元素,$unset替换指定的元素为null而不是删除掉指定的元素,此行为保持数组大小和位置一直;
从文档中删除一个或多个字段。
DB::collection('users')->where('name', 'John')->unset('note');
您还可以在模型上执行取消设置。
$user = User::where('name', 'John')->first();
$user->unset('note');
查询缓存
您可以使用remember方法轻松缓存查询结果:
$users = User::remember(10)->get()
网友评论