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) ASdistanceFROMshop_listHAVING distance < 1000

ORDER BY distance LIMIT 100;

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

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

SELECTshop_id ,

shop_name ,

lng ,

lat ,POWER(lat - 40.05748 , 2) + POWER(lng - 116.30759 , 2) * POWER(COS((lat + 40.05748) / 2) , 2) ASdistanceFROMshop_listHAVINGdistance< 1000

ORDER BYdistance

LIMIT100;

换做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})

mongdb mysql geospatial 比较_MongoDB的地理位置查询,以及和mysql的使用对比相关推荐

  1. 【MySQL】面试官:如何查询和删除MySQL中重复的记录?

    写在前面 最近,有小伙伴出去面试,面试官问了这样的一个问题:如何查询和删除MySQL中重复的记录?相信对于这样一个问题,有不少小伙伴会一脸茫然.那么,我们如何来完美的回答这个问题呢?今天,我们就一起来 ...

  2. mysql对结果限制_在查询中限制MySQL结果

    我正在寻找是否可以通过一个查询获得所需的结果,而我的MySQL技能仍处于青春期. 我有4张桌子:表演,艺术家,场地和游览.现在,我的主查询的简化版本如下所示: SELECT * FROM artist ...

  3. servlet mysql 分页_Java基础94 分页查询(以MySQL数据库为例,Servlet技术)

    1.概述 分页查询,也可叫做分批查询,基于数据库的分页语句(不同数据库是不同的). 本文使用的事MySql数据库. 假设:每页显示10条数据. Select * from contact  limit ...

  4. Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合

    Elasticsearch(三)--Es搜索(简单使用.全文查询.复合查询).地理位置查询.特殊查询.聚合操作.桶聚合.管道聚合 一.Es搜索 这里的 Es 数据博主自己上网找的,为了练习 Es 搜索 ...

  5. 详解基于MongoDB的地理位置查询,结合Symfony2演示

    简介 随着近几年各类移动终端的迅速普及,基于地理位置的服务(LBS)和相关应用也越来越多,而支撑这些应用的最基础技术之一,就是基于地理位置信息的处理.我所在的项目也正从事相关系统的开发,我们使用的是S ...

  6. 七(7)探花功能-MongoDB地理位置查询-附近的人

    课程总结 1.探花功能 业务需求 执行过程 2.MongoDB的地理位置查询 地理位置查询的应用场景 查询案例 3.搜附近 上报地理位置 使用MongoDB搜索附近 一. 探花左划右滑 探花功能是将推 ...

  7. mysql geo_地理位置geo处理之mysql函数的详细介绍(附代码)

    本篇文章给大家带来的内容是关于地理位置geo处理之mysql函数的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 目前越来越多的业务都会基于LBS,附近的人,外卖位 ...

  8. mysql geo 函数_【后端开发】地理位置geo处理之mysql函数的详细介绍(附代码)

    本篇文章给大家带来的内容是关于地理位置geo处理之mysql函数的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 目前越来越多的业务都会基于LBS,附近的人,外卖位 ...

  9. mysql 慢日志 作用_MySQL慢查询日志的作用和开启

    前言 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中.lon ...

最新文章

  1. mysql多列索引不全用,MySQL多列索引的生效规则
  2. SQL Server 2008 R2 安全性专题(一):安全原则
  3. java.net.SocketException四大异常解决方案
  4. python安装教程mac-Mac 安装python 3.*新版本的详细步骤
  5. UIApplication shared application用法总结
  6. 在panel中显示一个新的form
  7. python画海绵宝宝_脑洞大开的万圣节,10招带你和宝宝花式玩南瓜
  8. QT操作sqlite概念
  9. typeof 和instanceof
  10. jquery 随楼层滚动导航激活状态改变特效
  11. Color the ball(树状数组区间更新+单点求值)
  12. 2020icpc赛事安排
  13. U盘分区,一盘两用,分为启动盘和读写盘
  14. GEO TCGA公共数据挖掘培训
  15. HTML页面可视化快速设计
  16. 服务器匹配原理,王者荣耀实现原理学习笔记
  17. 四信5G工业智能网关加速5G全连接智慧工厂落地 抢占生产“智”高点
  18. python基础包的functools的reduce方法-亢保星
  19. 咖说 | TON 项目宣告终止!但社区还将继续进行开发和发币
  20. Ubuntu18.04安装opencv和opencv_contrib

热门文章

  1. sql开启mysql远程连接_CentOS系统中安装MySQL和开启MySQL远程访问的方法
  2. python自动化框架2019_【转】python3实现自动化框架robotframework
  3. python selenium爬虫_详解基于python +Selenium的爬虫
  4. 比0 冷1度c语言编程,关于DS18B20的C语言程序(精确度0.1度).doc
  5. 20220209-CTF MISC-BUUCTF-qr-被嗅探的流量(查找POST包)
  6. /etc/ssh/sshd_config 关建字:PermitRootLogin no  禁示以root身份登录服务器
  7. Linux CentOS 6.5 + Apache + Mariadb + PHP环境搭建
  8. 《Delphi XE6 android 编程入门教程》推荐
  9. Jetty架构解析及应用示例
  10. C#操作注册表增删改查及关机能保存问题