用一个下午从零开始搭建一个基础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', [, ])->get();
如果是geoNear命令,必须用command来调用:
$db = DB::connection('mongodb')->getMongoDB();
$result = $db->command([
'geoNear' => "lbs_people",
'near' => [,],
'spherical' => true, // 启用特殊搜索
'num' => ]);
两者之间的主要区别在于,前者得到的结果可以继续配合其他查询构造语句进行检索,很符合使用Eloquent时的习惯。后者得到的是一个结果数组,要想对数据进行操作比较麻烦。
总结
其实做一个基础的lbs附近查询的服务就这么简单,对很多场景下,附近距离的要求其实没那么强化,也用不到什么geohash、geoJson。谢谢mongodb,一个下午就完事。
用一个下午从零开始搭建一个基础lbs查询服务的更多相关文章
- 从零开始搭建一个react项目
Nav logo 120 发现 关注 消息 4 搜索 从零开始搭建一个react项目 96 瘦人假噜噜 2017.04.23 23:29* 字数 6330 阅读 32892评论 31喜欢 36 项目地 ...
- 从零开始搭建一个简单的基于webpack的vue开发环境
原文地址:https://segmentfault.com/a/1190000012789253?utm_source=tag-newest 从零开始搭建一个简单的基于webpack的react开发环 ...
- 从零开始搭建一个PaaS平台 - 我们要做什么
前言 从最开始的小公司做小网站,到现在进入现在的公司做项目,发现小公司里很多很多工作都是重复的劳动(增删改查),不过想想也是,业务软件最基础的东西不就是增删改查吗. 但是很多时候,这种业务逻辑其实没有 ...
- vue-用Vue-cli从零开始搭建一个Vue项目
Vue是近两年来比较火的一个前端框架(渐进式框架吧). Vue两大核心思想:组件化和数据驱动.组件化就是将一个整体合理拆分为一个一个小块(组件),组件可重复使用:数据驱动是前端的未来发展方向,释放了对 ...
- Django1.8教程——从零开始搭建一个完整django博客(一)
第一个Django项目将是一个完整的博客网站.它和我们博客园使用的博客别无二致,一样有分类.标签.归档.查询等功能.如果你对Django感兴趣的话,这是一个绝好的机会.该教程将和你一起,从零开始,搭建 ...
- 如何用Django从零开始搭建一个网站(0)
python,django等安装就直接略过了.下面直接奔如主题,搭建网站. Step1:新建一个django project,运行命令:‘django-admin startproject myPit ...
- 在django中如何从零开始搭建一个mock服务
mock概念 mock 就是模拟接口返回的一系列数据,用自定义的数据替换接口实际需要返回的数据,通过自定义的数据来实现对下级接口模块的测试.这里分为两类测试:一类是前端对接口的mock,一类是后端单元 ...
- Django1.8教程——从零开始搭建一个完整django博客(三)
这一节主要介绍对数据库的访问操作:通过管理器(manage),对对象进行检索.修改.删除等操作,详细介绍了如何针对不同的模型自定义管理器. 查询和管理工作 现在,我们已经有了一个功能完善的Django ...
- 做一个项目前搭建一个tabBar(一)框架
前言 通常做一个项目前,不算开始讨论需求,分析产品等等,一开始会给我们搭建一个框架,今天简单说一下搭建框架. github网址:https://github.com/Moonths/iWatch.gi ...
随机推荐
- SharePoint 指定配置数据库访问账户“域账户\用户”
大家在安装sharepoint时都会遇到这个问题,域账户,什么是域账户哪?域账户简单理解就是网路账户,与本地账户不同,什么是域哪?域就是控制器. 一台Windows 计算机,它要么隶属于工作组,要么隶 ...
- Linux下Redis安装及配置
1.下载安装包 # cd ~/Download # wget http://download.redis.io/releases/redis-3.0.7.tar.gz --选择要下载的版本 ...
- Greenplum源码编译安装(单机及集群模式)完全攻略
公司有个项目需要安装greenplum数据库,让我这个gp小白很是受伤,在网上各种搜,结果找到的都是TMD坑货帖子,但是经过4日苦战,总算是把greenplum的安装弄了个明白,单机及集群模式都部署成 ...
- CSS中的 backgroundPosition 属性
body { background-image:url('bgimage.gif'); background-repeat:no-repeat; background-attachment:fixed ...
- 三星嵌入式开发平台 三星Cortex-A9 4412 POP与SCP对比
iTOP-4412核心板是迅为电子推出的一款高端四核核心板,其中分为POP封装与SCP封装,配备三星Exynos 4412四核处理器,主频为1.4GHz,内置16GB存储空间.该板设计小巧.配备三星自 ...
- Linux 系统常用命令汇总(七) 安全设置
安全设置 分类 命令 选项 注解 安全策略 selinux setenforce number(0,1) 设置selinux状态,0关闭,1开启 getenforce 显示当前selinux状态,e ...
- Openstack-Ceilometer-SNMP的使用
1. 物理服务器配置 1.1安装 #yum install -y net-snmp net-snmp-utils 1.2 配置 复制[附件]中snmpd.conf文件到/etc/snmp/目 ...
- java方法可变参数的写法
jdk1.5之后出现的,该写法避免了当有多个不同个数的参数方法时,对方法的重载.其实就是数组. package com.shipin; /** * @author QiaoJiafei * @vers ...
- 【问题&解决】解决 Android SDK下载和更新失败“Connection to https://dl-ssl.google.com refused”的问题
缘由: 更新sdk,遇到了更新下载失败问题: Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xmlFetche ...
- js立即执行函数: (function ( ){...})( ) 与 (function ( ){...}( )) 有区别?
没有区别. 你需要明白 IIFE 的原理,我简单说一下: function foo() {...} // 这是定义,Declaration:定义只是让解释器知道其存在,但是不会运行. foo(); / ...