一、话不多少直接上代码
/**
* 聚合操作
* @param array $pipeline
* @return mixed
*/
public function mongo($pipeline = [])
{
return $this->collection()->cmd([
'aggregate' => $this->name,
'pipeline' => $pipeline,
'explain' => false,
]);
}
/**
* 集合文档名称
* Db::connect('mongo')->table(表全名)
* @return mixed
*/
public function collection()
{
return Db::connect($this->connection)->name($this->name);
}
/**
* 首页学校列表
* @param Request $request
* @return Json
*/
public function SchoolInfoList(Request $request)
{
$get = $request->get();
try {
$data = $this->mongo([
['$geoNear'=>
['near'=>[floatval($get[0]),floatval($get[1])],// 参数一 经度 参数二纬度
'query' => ['school_audit'=>1],
'spherical'=>true,
'distanceMultiplier'=>intval(6378137),
'maxDistance'=>floatval(50000/6378137),
'distanceField'=>"distance"]
]]);
}catch (\Exception $exception){
return fail('附近暂无学校');
}
if(empty($data))
{
return fail('附近暂无学校');
}
//距离处理
foreach ($data as &$val)
{
$val['distance'] = round($val['distance']/1000,1);
}
return success($data,200001,'获取附近学校成功');
}
二、原生语句
db.school.aggregate({
$geoNear:{
query:{school_audit:1}, // 查询条件 因为这里我这个业务有审核的这个东西 可以去掉
near: [121.55892,31.243515], // 当前坐标
spherical: true, // 计算球面距离
distanceMultiplier: 6378137, // 地球半径,单位是米,那么的除的记录也是米
maxDistance: 100000/6378137, // 过滤条件100000米内,需要弧度
distanceField: "distance",// 距离字段别名
}
})
显示与当前的距离