MongoDB的一个特色就是具有丰富的查询接口,比如地理位置查询。

  在地理位置查询上,MongoDB有着比传统关系型数据库的优势,下面举个例子。

  当前移动互联网应用,按用户离目标门店距离排序上的场景很多。

  比如:

  一张门店表shop_list,表结构字段包括shop_id,shop_name,lng,lat (门店id,门店名称,以及门店的经纬度等)。

  现收集到当前用户的所处位置的经纬度是,经度116.30759,纬度40.05748。获取距离用户1000m以内的100家门店,按照距离从近到远排序。

 MySql的查询语句如下:

SELECT shop_id,shop_name,lng,lat, ROUND(6378.138*2*ASIN(SQRT(POW(SIN((40.05748*PI()/180-lat*PI()/180)/2),2)+COS(40.05748*PI()/180)*COS(lat*PI()/180)*POW(SIN((116.30759*PI()/180-lng*PI()/180)/2),2)))*1000) AS distance
FROM shop_list
HAVING distance < 1000
ORDER BY distance LIMIT 100;

  一个这样的计算方法,显然mysql性能比较差。

下面的这个计算方法更快一些,效果和上面的几乎差不多,只是距离distance并不真实。如果只想按照距离排序查出结果是没问题的。

SELECT
shop_id ,
shop_name ,
lng ,
lat ,
POWER(lat - 40.05748 , 2) + POWER(lng - 116.30759 , 2) * POWER(COS((lat + 40.05748) / 2) , 2) AS distance
FROM
shop_list
HAVING
distance < 1000
ORDER BY
distance
LIMIT 100;

  换做MongoDB会如何呢?

  首先,要明确MongoDB在使用距离查询时,存储的经纬度结构要类似这样才可以:

'point' : [
116.299,
40.053
] 或者: 'point' : {
'lng' : 116.299,
'lat' : 40.053
}

  然后给经纬度的point做一个2dSphere索引。具体参考官方文档: 

db.shop_list.createIndex({"point":"2dsphere"})

第三个用法可以得出距离值:

#这个点的附近
db.shop_list.find({'point':{$nearSphere: [116.30759, 40.05748]}}) #这个点的附近1000米
db.shop_list.find({point: { $geoWithin: { $centerSphere: [ [ 116.30759, 40.05748 ], 1000/6378137 ] } } }) #这个点的附近1000米的10个门店,并且有距离计算值
db.runCommand({ geoNear : "shop_list" , near : [ 116.30759, 40.05748], num : 10 , spherical:true, distanceMultiplier: 6378137, maxDistance:1000/6378137})

  

  

    

MongoDB的地理位置查询,以及和mysql的使用对比的更多相关文章

  1. mongodb高级聚合查询

    在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysql复杂很多. 注:本文基于 mo ...

  2. mongodb高级聚合查询(转)

    在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysql复杂很多. 注:本文基于 mo ...

  3. mongodb,redis,memcached,mysql对比

    1.性能都比较高,性能对我们来说应该都不是瓶颈总体来讲,TPS方面redis和memcache差不多,要大于mongodb 2.操作的便利性memcache数据结构单一redis丰富一些,数据操作方面 ...

  4. 使用morphia实现对mongodb的聚合查询

    morphia是谷歌的一个针对mongodb的数据化持久框架: 关于mongodb的介绍不在这里展示,直接进入主题:采用morphia实现对mongodb的聚合查询 这里获取所有学生的分数总和 spr ...

  5. python数据库-mongoDB的高级查询操作(55)

    一.MongoDB索引 为什么使用索引? 假设有一本书,你想看第六章第六节讲的是什么,你会怎么做,一般人肯定去看目录,找到这一节对应的页数,然后翻到这一页.这就是目录索引,帮助读者快速找到想要的章节. ...

  6. mongodb 高级聚合查询

    mongodb高级聚合查询   在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysq ...

  7. elasticsearch地理位置查询

    elasticsearch地理位置查询 一.背景 二.geo数据类型 1.geo_point 2.geo_shape 三.此处对geo_point类型实战 1.背景 2.插入地点数据 1.创建索引 2 ...

  8. MongoDB 覆盖索引查询

    MongoDB 覆盖索引查询 官方的MongoDB的文档中说明,覆盖查询是以下的查询: 所有的查询字段是索引的一部分 所有的查询返回字段在同一个索引中 由于所有出现在查询中的字段是索引的一部分, Mo ...

  9. MongoDB 入门之查询(find)

    MongoDB 入门之查询(find) 1. find 简介 (1)find的第一个参数决定了要返回哪些文档. 空的查询文档会匹配集合的全部内容.默认就是{}.结果将批量返回集合c中的所有文档. db ...

随机推荐

  1. JS中使用document.defaultView.getComputedStyle()、currentStyle()方法获取CSS属性值

    在对网页进行调试的过程中,经常会用到js来获取元素的CSS样式,方法有很多很多,现在仅把我经常用的方法总结如: 1. obj.style:这个方法只能JS只能获取写在html标签中的写在style属性 ...

  2. 【工具相关】ionic-通过nmp安装最新版本的 cordova 和 ionic

    一,命令行下输入: sudo npm install -g cordova ionic 用来安装最新版本的cordova和ionic. 如下图所示: 二,等待一下,如下图所示. 三,用命令 npm u ...

  3. 【读书笔记】iOS-发布你的应用

    一,添加图标 你的应用在iPhone主屏幕上的标准图标(Icon.png)是57像素*57像素的正方形,PNG格式,不能有透明效果或者图层,72DPI.除些之外,你还可以提供一个同样格式的114像素* ...

  4. spring 开发 Tars

    和不使用 Spring 的 tars HelloWord 项目相比,客户端完全一样,服务端两个地方不一样 创建不使用 Spring 的 tars HelloWord 步骤: https://www.c ...

  5. 基于InfluxDB实现分页查询功能

    InfluxDB作为时序数据库中的翘楚,应用范围非常广泛,尤其在监控领域. 最近做了一个功能,将InfluxDB中的数据查询出来后,在前台分页展现,比如每页10条,一共100页,可以查看首页.末页,进 ...

  6. 《Inside C#》笔记(十一) 运算符重载

    运算符重载与之前的索引器类似,目的是为了让语言本身使用起来更方便直接,也是一种语法糖. 一 运算符重载(Operator Overloading) 运算符重载的存在,使得现有的各种运算符可以被重新定义 ...

  7. Django ModelForm 校验数据格式

    发现ModelForm很好用,用来做form表单验证效果很好.但是也要注意几点. forms的用法: 使用默认方式:继承forms.Form类,类里面的字段名称一定要和前端HTML里面的form表单里 ...

  8. (网页)jQuery UI 实例 - 日期选择器(Datepicker)

    默认功能 日期选择器(Datepicker)绑定到一个标准的表单 input 字段上.把焦点移到 input 上(点击或者使用 tab 键),在一个小的覆盖层上打开一个交互日历.选择一个日期,点击页面 ...

  9. Linux笔记(二): WIN 10 Ubuntu 双系统

    (一)  说明 记录一次ubuntu安装过程及遇到的问题. 环境:WIN 10 单硬盘 (二)  ubuntu ISO文件下载 ubuntu 18.04 https://www.ubuntu.com/ ...

  10. webrtc学习: 部署stun和turn服务器

    webrtc的P2P穿透部分是由libjingle实现的. 步骤顺序大概是这样的: 1. 尝试直连. 2. 通过stun服务器进行穿透 3. 无法穿透则通过turn服务器中转. stun 服务器比较简 ...