• 用一个下午从零开始搭建一个基础lbs查询服务


    背景

    现在做一个sns如果没有附近的功能,那就是残缺的。网上也有很多现成的lbs服务,封装的很完整了。

    我首先用了下百度lbs云,但是有点不适合自己的需要,因此考虑用mongodb建一个简单的lbs服务,配合laravel进行附近的查询。

    P.S这篇文章是为了记个要点,免得几个月后又忘了,所以具体过程不太详细,需要的朋友百度下很容易就会上手,我也标注了一些网址

    安装部署mongodb

    网上很多教程,不再重复,需要注意的是:3.0+版本的用户验证系统有新的规则很麻烦,所以推荐继续用2.6+的版本,记得再装上php驱动

    完成安装后启动mongod.exe 新建一个数据库

    数据库添加管理员

    1.用控制台打开mongo.exe 

    2.输入use admin   ----->这一步是转到默认的用户管理数据库,以便创建一个全局管理员)

    3.直接用db.addUser("root","12345")  ------>这是已经作废的命令,生成一个角色为root的管理员,有全部权限。

    4.关闭mongod.exe服务和mongo.exe,用mongod --auth启用数据服务,要求用户权限,用 mongo.exe -u root -p 12345 --authenticationDatabase admin启动客户端  ------>用root管理员登录,才能为你的collection创建管理员http://docs.mongodb.org/v2.6/tutorial/add-user-administrator/

    5.比如我的lbs数据库名称叫做lbs_people,则输入下面的内容,创建一个叫lbsadmin的管理员,这里需要注意的是,role应该为dbOwner,意思是有该collection的读写查权限,不用dbAdmin,那个是维护权限

    use lbs_people
    db.createUser({
        user: "lbsadmin",
        pwd: "password",
        roles: [ { role: "dbOwner", db: "lbs_people" } ] 
    } )

    mongodb添加lbs查询支持

    lbs附近查询,用到的是geoNear和near两个命令,相关的区别是索引的不同

    • 1.geoNear使用的2dsphere索引,简单来讲就是经纬度(WGS84)来查,要准一些,必须用command命令来调用http://docs.mongodb.org/v2.6/tutorial/query-a-2dsphere-index/
    • 2.near使用2d索引,简单来讲就直接平面坐标计算,结果要差一些http://docs.mongodb.org/v2.6/reference/operator/query/near/#op._S_near

    具体要用哪一个主要还是根据项目需求来,我比较倾向2d索引,原因见后面在laravel里面的使用。

    怎么添加索引:假设我用poi字段来作为坐标字段,在客户端中输入db.lbs_people.ensureIndex({poi:"2d"})即可

    laravel中的使用

    因为我只用到mongodb保存数据的ID做lbs附近查询,功能用的很少。

    在laravel有一个jenssegers/laravel-mongodb包,可以让mongodb的操作和Eloquent一样简单,具体安装使用请查看https://github.com/jenssegers/laravel-mongodb

    在model中建立一个名为LbsPeople的类代表mongodb中的collection(请参考github中的详细介绍)

    class LbsPeople extends Moloquent {
    
        protected $collection = 'lbs_people';
        protected $connection = 'mongodb';
        
    }

    这里主要说说为什么要用2d索引(即near命令)来做附近查询http://docs.mongodb.org/v2.6/reference/operator/query/near/#op._S_near

    如果是用near命令,那么代码就一句话:

    $res=LbsPeople::where('poi', 'near', [2, 2])->get();

    如果是geoNear命令,必须用command来调用:

      $db = DB::connection('mongodb')->getMongoDB();
     $result = $db->command([
                    'geoNear' => "lbs_people",
                    'near' => [2,2],
                    'spherical' => true, // 启用特殊搜索
                    'num' => 100]);

    两者之间的主要区别在于,前者得到的结果可以继续配合其他查询构造语句进行检索,很符合使用Eloquent时的习惯。后者得到的是一个结果数组,要想对数据进行操作比较麻烦。

    总结

    其实做一个基础的lbs附近查询的服务就这么简单,对很多场景下,附近距离的要求其实没那么强化,也用不到什么geohash、geoJson。谢谢mongodb,一个下午就完事。

  • 相关阅读:
    IdentityServer4 令牌端点
    IdentityServer4 授权端点
    IdentityServer4 发现端点
    IdentityServer4 注销端点
    IdentityServer4 自检端点
    spring boot 项目简单打包部署
    如何进阶成公司 Git 小能手
    Git常用命令参考手册
    网络面试题总结
    Nginx面试可能问到的部分
  • 原文地址:https://www.cnblogs.com/matoo/p/4807782.html
Copyright © 2020-2023  润新知