Laravel基于MongoDb(LBS)实现附近的人、店铺、房源

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 前提PHP需要安装MongoDb扩展一、Laravel安装mongodb扩展composer require jenssegers/mongodb ^3.6 -vvv

前提PHP需要安装MongoDb扩展


一、Laravel安装mongodb扩展


composer require jenssegers/mongodb ^3.6 -vvv
复制代码


二、控制器方法填充一些测试数据


$res = DB::connection('mongodb')
    ->table('t2')
    ->insert( [
        'name'=>'juejin',
        'loc' => [
            'longitude' => 116.48105 ,
            'latitude' =>39.996794,
        ],
    ]);
$res = DB::connection('mongodb')
    ->table('t2')
    ->insert( [
        'name'=>'ireader',
        'loc' => [
            'longitude' => 116.514203 ,
            'latitude' =>39.905409,
        ],
    ]);
$res = DB::connection('mongodb')
    ->table('t2')
    ->insert( [
        'name'=>'meituan',
        'loc' => [
            'longitude' => 116.489033,
            'latitude' =>40.007669,
        ],
    ]);
$res = DB::connection('mongodb')
    ->table('t2')
    ->insert( [
        'name'=>'jd',
        'loc' => [
            'longitude' => 116.562108 ,
            'latitude' =>39.787602,
        ],
    ]);
$res = DB::connection('mongodb')
    ->table('t2')
    ->insert( [
        'name'=>'xiaomi',
        'loc' => [
            'longitude' => 116.334255 ,
            'latitude' =>40.027400,
        ],
    ]);
复制代码


三、如果要做附近的人要设置索引


网络异常,图片无法展示
|


四、封装附近的推荐服务类


<?php
namespace App\Http\Controllers\Service;
use Illuminate\Support\Facades\DB;
class NearbySeller
{
    private $longitude;#经度
    private $latitude;#纬度
    private $mongodb;
    /**
     * 初始化
     *
     * @param string $collection 需要操作的集合
     * @param float $longitude 经度
     * @param float $latitude 纬度
     */
    public function __construct($collection, $longitude, $latitude)
    {
        $this->longitude = (float)$longitude;
        $this->latitude = (float)$latitude;
        $this->mongodb = DB::connection('mongodb')->collection($collection);
    }
    /**
     * 搜索多少km内的信息,由近到远的顺序返回
     * @param integer $kilometer 获取多少km内的信息
     * @param integer $perPage 获取多少数据,每页
     * @param integer $page 获取的第几页,
     *
     * @return 返回获取到的地址距离
     */
    public function getRangeBySort($kilometer, $page, $limit)
    {
        $where = [
            'loc' => [
                '$nearSphere' => [
                    '$geometry' => [
                        'type' => 'Point',
                        'coordinates' => [$this->longitude, $this->latitude]
                    ],
                    '$maxDistance' => $kilometer*1000
                ]
            ],
        ];
        $list = $this->mongodb->whereRaw($where)->skip(($page-1) * $limit)->take($limit)->get();
        return $list;
    }
    /**
     * 搜索多少km内的信息,由近到远的顺序返回
     * @param integer $kilometer 获取多少km内的信息
     *
     * @return 返回获取到的地址距离
     */
    public function getRadiusBydisorder($kilometer)
    {
        $where = [
            'loc' => [
                '$geoWithin' => [
                    '$centerSphere' => [
                        [
                            $this->longitude,
                            $this->latitude
                        ],
                        $kilometer/6371
                    ]
                ]
            ],
        ];
        $list = $this->mongodb->whereRaw($where)->get();
        return $list;
    }
}
复制代码


五、控制器方法进行调用


$near = new NearbySeller('t2', 116.48105, 39.996794);
$page = $request->get('page') ?: 1;
$limit = 3;
// 测试获取多少km以内的门店信息,列表模式
$list = $near->getRangeBySort(20, $page, $limit);
// 测试多少km半径内的门店信息,地图模式
$list = $near->getRadiusBydisorder(20);


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
NoSQL 安全 Java
SpringBoot系列(2)整合MongoDB实现增删改查(完整案例)
自己本科时候一直使用的是Mysql,目前的课题组使用的是MongoDB,因此就花了一部分时间整理了一下,实现springboot与MongoDB的整合,并且实现基本的增删改查操作,从头到尾给出一个完整的案例。
1077 0
SpringBoot系列(2)整合MongoDB实现增删改查(完整案例)
|
存储 NoSQL Java
mongodb基于地理位置查询实现围栏
mongodb基于地理位置查询实现围栏
1571 0
|
NoSQL 前端开发 Java
基于 Mongodb 实现商品管理系统之准备工作讲解|学习笔记
快速学习基于 Mongodb 实现商品管理系统之准备工作讲解
基于 Mongodb 实现商品管理系统之准备工作讲解|学习笔记
|
NoSQL 数据库连接 MongoDB
基于 Mongodb 实现商品管理系统之向数据库中添加商品编写讲解|学习笔记
快速学习基于 Mongodb 实现商品管理系统之向数据库中添加商品编写讲解
基于 Mongodb 实现商品管理系统之向数据库中添加商品编写讲解|学习笔记
|
NoSQL 数据库连接 MongoDB
基于Mongodb实现商品管理系统之根据商品编号删除商品编写讲解|学习笔记
快速学习基于Mongodb实现商品管理系统之根据商品编号删除商品编写讲解
基于Mongodb实现商品管理系统之根据商品编号删除商品编写讲解|学习笔记
|
NoSQL MongoDB Android开发
基于 Mongodb 实现商品管理系统之 Web 层编写讲解|学习笔记
快速学习基于 Mongodb 实现商品管理系统之 Web 层编写讲解
基于 Mongodb 实现商品管理系统之 Web 层编写讲解|学习笔记
|
存储 缓存 NoSQL
分布式服务器框架之Servers.Core中 实现Log模块设计 写入MongoDB数据库
游戏服务器中都需要用到Log模块,log模块存在的意义第一个是将log输出到控制台又或者是写入到log文件中,出了BUG方便定位;第二是常用于将用户的数据(例如玩家登录、道具购买量)将这种log统计到数据库中,方便统计用户留存信息、数据分析等。
|
NoSQL MongoDB 数据库
分布式服务器框架之Server.Core库中实现YFUniqueEntity、YFUniqueIDBase 管理MongoDB 自定义Id的自增
YFUniqueEntity是数据库中的结构,GetUniqueID函数中会根据Type和自增步长去数据库中寻找该类型的当前ID是多少,然后会用当前的Id去加上步长,把更新后的新ID插入到MongoDB中记录着ID的那张表里。
|
NoSQL MongoDB
分布式服务器框架之Servers.Core库中实现 MongoEntityBase 实现阻塞 异步对MongoDB的增删改查
YFMongoDBModelBase类是个模板类,对模板参数进行了约束YFMongoEntityBase,必须要继承YFMongoEntityBase
|
JSON NoSQL MongoDB
分布式服务器框架之Servers.Core库中实现MongoDB的ObjectId和Json转换
分布式服务器框架之Servers.Core库中实现MongoDB的ObjectId和Json转换