近期作为突击队员,与同事一起突击构建了一个简单的lbs系统。当前比较主流的做法是使用mongodb,因为其已经封装了常用的lbs基本操作(如查找附近的人),功能非常强大,对于开发周期只有一周的项目,mongodb真可谓是救世主,把最重要的需求给完成了,谢天谢地!

mongodb是比较著名的nosql db,想了解的同学不妨问问谷歌或度娘,对于专业问题本人倾向于问谷歌。本文还参考了这篇文章。我们使用的是目前最新版本的mongodb-2.4.9。

首先从mongodb提供的lbs功能讲起:mongodb支持以下几种查询:

1.区域内搜索:所谓区域内搜索,即列出附近一定范围内的所有记录,如baidu地图的“附近”。mongodb使用$geoWithin命令即可实现此类查询,其强大之处在于支持矩形区域($box)、圆形区域( $center)和多边形区域( $polygon)查询!以圆形区域查询为例,只需要给出圆心的经纬度和查询半径,就可以取到在该区域内的所有记录,不过返回结果是无序的。

2.查找附近:查找附近即将某一个位置附近的记录按照由近到远的顺序返回,如很多社交app的查找附近的人。mongodb使用$near命令,输入中心点的坐标即可返回结果,结果是按照距离由小到大排序好的。$near接口比$geoWithin多了一步排序,但对2维坐标建索引的话,二者的查询效率基本相同。

另外还有一个命令是$geoNear,可以认为是$near的升级版,除了返回记录之外还会返回距离及其他诊断信息。我们的应用需要计算距离,一开始就想使用这个命令,但是其使用很不方便。很奇怪的,该命令不能像$near和$geoWithin般可以和find命令集成,使用过程中很不灵活,无法完全满足我们的应用需求。

其次说说距离计算

MongoDB地理位置索引常用的有两种:1)2d 平面坐标索引,适用于基于平面的距离计算。2)2dsphere 几何球体索引,适用于球面几何距离运算。追求百分之百的精确,应选择2dsphere。不过,在坐标跨度不太大(如两千公里以内),这两个索引计算出的距离相差几乎可以忽略不计。关于mongodb实现的2维地理位置索引,可以参考这篇文章,写的简单易懂。

接下来说说实践中碰到的复合索引的使用。因为mongodb是个开源项目,总会有些不完善的地方,而这些问题也只有使用的时候才会碰到。

复合索引即对多个字段联合建立索引,假设在一个mongo集合(collection)的记录含有A和B两个字段,我们要查询A大于0且B大于100的记录,显然A、B的复合索引{“A”:1,”B”:1}可以有效提高这类查询的效率,mongodb也做到了。该查询用mongo的语言描述为:db.posts.find({ “A”:{$gt:0}, “B”:{$gt:100} } )。但如果我们要得到A大于0且按照B升序排序的记录,刚才建立的联合索引就不起作用了。这个查询用mongo的语言描述为:db.posts.find({ “A”:{$gt:0}} ).sort({“B”:1})。

而且即使对所取记录总数做限制也无法提高查询效率。例如我假设复合条件的记录共有2000条,我只取100条,即db.posts.find({ “A”:{$gt:0}} ).sort({“B”:1}).limit(100)。按我的理解,如果复合索引起作用,不管limit与否都应该很快。但测试下来发现,查询的时间跟符合条件的记录总数成正比,即2000条取100条要50ms,而1000条取100条就只要30ms,似乎是不管limit多少,mongo会把所有满足find条件的记录全部读到内存,再根据sort的条件进行排序。这排序恰恰是性能的瓶颈所在,如果去除排序,2000条取100条也只要10ms左右,查询A大于0且B大于100的记录也是只要100ms。

据老外的分析,这个是mogodb目前的bug,应该会在2.6版本fix掉,希望如此吧。目前也没有什么办法可以优化这个问题,只能在find的时候通过更多的限制条件,减少被排序的记录数目,但在面对实际需求时往往不能这么做。

所以,此次项目学到的经验是,开源项目的确有非常强大的功能,帮我们解决了大部分基础问题,也常常给我们很多惊喜(如mongo对地理信息查询的强大而全面的支持)。不过,所谓“天下没有免费的午餐”,使用开源项目不仅需要学习怎么用,使用过程中也会遇到一些坑,需要交点学费,所以,要时刻保持谨慎和批判的态度。

利用mongodb开发lbs应用实践【转】相关推荐

  1. 利用mongodb开发lbs应用实践

    转载:http://www.tuicool.com/articles/feueEnz 近期作为突击队员,与同事一起突击构建了一个简单的lbs系统.当前比较主流的做法是使用mongodb,因为其已经封装 ...

  2. 结合MongoDB开发LBS应用(转)

    原文链接:结合MongoDB开发LBS应用 简介 随着近几年各类移动终端的迅速普及,基于地理位置的服务(LBS)和相关应用也越来越多,而支撑这些应用的最基础技术之一,就是基于地理位置信息的处理.我所在 ...

  3. MongoDB开发LBS应用

    随着近几年各类移动终端的迅速普及,基于地理位置的服务(LBS)和相关应用也越来越多,而支撑这些应用的最基础技术之一,就是基于地理位置信息的处理. 关于LBS的详细介绍及通用的几个解决方案,可以参考:深 ...

  4. 12.Laravel5学习笔记:使用mongodb开发LBS应用

    做LBS应用有多种方案,这里介绍一下在Laravel5中使用Mongodb来实现,文章参考了: 深入浅出Symfony2 - 结合MongoDB开发LBS应用 环境说明: php集成环境:xampp ...

  5. 结合MongoDB开发LBS应用

    http://www.cnblogs.com/jifeng/p/4356052.html 然后列举一下需求: 1.实时性要高,有频繁的更新和读取 2.可按距离排序支持分页 3.支持多条件筛选(一个经纬 ...

  6. 结合MongoDB开发LBS应用(mongodb geo)

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

  7. 结合MongoDB开发LBS应用——附近的人

    "The palest ink is better than the best memory"--好记性不如烂笔头.2013~2015补记 题记: 2014.7月业务数据增长,附近 ...

  8. android opengl ppt,Android开发和 与实践课件第12章利用OpenGL实现3D图形.ppt

    Android开发和 与实践课件第12章利用OpenGL实现3D图形.ppt half, -half, half, half, half, half, // 上面 -half, half, half, ...

  9. 干净架构在 Web 服务开发中的实践

    干净架构(The Clean Architecture)是 Bob 大叔在 2012 年的一篇博文 The Clean Architecture 中,提出的一种适用于复杂业务系统的软件架构方式.干净架 ...

最新文章

  1. 接到三无产品的测试需求时怎么办
  2. CSharp数据库代码生成工具
  3. [NOIP2009] 最优贸易 (最短路,分层图)
  4. Linux 高可用(HA)集群之Pacemaker详解
  5. 图像识别中的深度学习【香港中文大学王晓刚】
  6. 未定义标识符 stringc/c++(20)_到 2024 年,阿斯顿·马丁汽车销量的 20%以上将是电动汽车...
  7. C#学习之向量运算符重载
  8. 【吐槽】VS2012的安装项目只能用InstallShield Limited Edition
  9. linux 关闭本地防火墙_如何使用Linux防火墙阻止本地欺骗地址
  10. STM32工作笔记0019---新建工程模板-基于固件库-M3
  11. 利用WPF建立自适应窗口大小布局的WinForm窗口
  12. tdav_converter_video.cxx:49:9: error: ‘uint8’ does not name a type; did you mean ‘uint’?
  13. php网上花店管理系统的论文,网上花店管理系统
  14. chrome控制台出现/null访问
  15. MongoDB——聚合管道之$limit$skip$sort操作
  16. linux openpty函数,pseudo-terminal 基础一
  17. 【转载】如何自己DIY组装一台台式电脑
  18. 关于squid版本问题
  19. 微信小程序——微信开发者工具添加less插件
  20. 电子计算机原理讲义,最新计算机原理讲义资料.doc

热门文章

  1. vue2 关于开发插件的几点思考
  2. Kafka源码分析-序列3 -Producer -Java NIO(Reactor VS Peactor)
  3. 《徐徐道来话Java》:PriorityQueue和最小堆
  4. 站点公司亚马逊砸了10亿也没能做成智能手机,技术是须要沉淀和积累的
  5. 老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 1...
  6. Java并发(一)wait()与notifyAll()
  7. 15、Windows驱动开发技术详解笔记(11) 基本概念
  8. Elasticsearch了解多少,说说你们公司es的集群架构,索引数据大小,分片有多少,以及一些调优手段 。
  9. RabbitMq(十二) 借用死信交换机实现延迟队列
  10. akka balance router的实现