地理位置索引支持是MongoDB的一大亮点,这也是全球最流行的LBS服务foursquare 选择MongoDB的原因之一。我们知道,通常的数据库索引结构是B+ Tree,如何将地理位置转化为可建立B+Tree的形式,下文将为你描述。

首先假设我们将需要索引的整个地图分成16×16的方格,如下图(左下角为坐标0,0 右上角为坐标16,16):

单纯的[x,y]的数据是无法建立索引的,所以MongoDB在建立索引的时候,会根据相应字段的坐标计算一个可以用来做索引的hash值,这个值叫做geohash,下面我们以地图上坐标为[4,6]的点(图中红叉位置)为例。

我们第一步将整个地图分成等大小的四块,如下图:

划分成四块后我们可以定义这四块的值,如下(左下为00,左上为01,右下为10,右上为11):

01 11
00 10

这样[4,6]点的geohash值目前为 00

然后再将四个小块每一块进行切割,如下:

这时[4,6]点位于右上区域,右上的值为11,这样[4,6]点的geohash值变为:0011

继续往下做两次切分:

最终得到[4,6]点的geohash值为:00110100

这样我们用这个值来做索引,则地图上点相近的点就可以转化成有相同前缀的geohash值了。

我们可以看到,这个geohash值的精确度是与划分地图的次数成正比的,上例对地图划分了四次。而MongoDB默认是进行26次划分,这个值在建立索引时是可控的。具体建立二维地理位置索引的命令如下:

db.map.ensureIndex({point : "2d"}, {min : 0, max : 16, bits : 4})

其中的bits参数就是划分几次,默认为26次。

http://blog.nosqlfan.com/html/1811.html

转载于:https://www.cnblogs.com/taoweiji/p/3710495.html

图解 MongoDB 地理位置索引的实现原理相关推荐

  1. 图解GeoHash算法--MongoDB 地理位置索引的实现原理

    转载自:http://blog.nosqlfan.com/html/1811.html 地理位置索引支持是MongoDB的一大亮点,这也是全球最流行的LBS服务foursquare 选择MongoDB ...

  2. mongodb地理位置索引实现原理

    地理位置索引支持是MongoDB的一大亮点,这也是全球最流行的LBS服务foursquare 选择MongoDB的原因之一.我们知道,通常的数据库索引结构是B+ Tree,如何将地理位置转化为可建立B ...

  3. Mongodb地理位置索引

    正在官方: 介绍:http://docs.mongodb.org/manual/applications/geospatial-indexes/ 建立索引:http://docs.mongodb.or ...

  4. MongoDB的地理位置索引

    背景 我们平常打开一些App的时候,经常有一个"查询周边景点"的功能,如我在高德里面就查询到了附近的景点. ​ 这种计算如果通过普通的关系型数据库,那对服务器和数据库的性能要求就太 ...

  5. mongodb java 地理位置_MongoDB的地理位置索引

    背景 我们平常打开一些App的时候,经常有一个"查询周边景点"的功能,如我在高德里面就查询到了附近的景点. 这种计算如果通过普通的关系型数据库,那对服务器和数据库的性能要求就太高了 ...

  6. ddtv.space index.php,图解MongoDB原理(二)

    根据上篇文章<图解MongoDB原理>的基本介绍,本文以具体的操作为例继续深入解析mongodb. 演示的所有服务都是在一台机器上,我的目录是F:\JAVA\MongoDB\cluster ...

  7. mongodb之索引学习

    学习索引分类和创建索引:                 1._id索引 大多数集合默认的索引 2.单键索引:手动创建,一个单一的值 3.多建索引:组合函数 4.复合索引 :最左前缀原则 5.过期索引 ...

  8. mongo 唯一约束索引_快速掌握mongoDB(三)——mongoDB的索引详解

    1 mongoDB索引的管理 本节介绍mongoDB中的索引,熟悉mysql/sqlserver等关系型数据库的小伙伴应该都知道索引对优化数据查询的重要性.我们先简单了解一下索引:索引的本质就是一个排 ...

  9. Mongodb存储特性与内部原理

    前言 本文重点叙述下mongodb存储特性和内部原理, 下一篇文章咱们一起来搭建下Replica Sets+Sharded Cluster的集群 存储引擎 wiredTiger引擎 1.3.0新增引擎 ...

最新文章

  1. 设计模式学习笔记(二十二:备忘录模式)
  2. Java 技术之垃圾回收机制
  3. 客户端读写数据到HDFS的流程
  4. Request.Form的用法
  5. 【BZOJ】1004: [HNOI2008]Cards(置换群+polya+burnside)
  6. mysql 2008数据库配置文件_SQL Server 2008数据库的配置及连接
  7. 【英语之夜】遇见--Peter
  8. iOS TestFlight 使用详解
  9. loadrunner视频资料地址-boobooke
  10. 异数OS 织梦师-水桶(三)-- RAM共享存储方案
  11. 喜讯!云效度量能力获信通院先进级评估
  12. 《激荡三十年》七、国企难破局—“裁缝神话”步鑫生
  13. html语言星号,DIV+CSS 星号*
  14. qlikview中日期问题的两个小结
  15. LTE学习笔记4之物理层信道与信号
  16. POI根据模板导出word文件,以及word转PDF,PDF转图片再插入PDF中(防止PDF被修改)
  17. 英伟达 Magic3D:一句话生成3D模型,分辨率清晰8倍,速度快2倍,编辑文本还可直接修改...
  18. 嵌入式Linux内核配置、裁剪与编译浅析(ARM版)
  19. 非组蛋白带什么电荷_非组蛋白是构成真核生物染色体的基本结构蛋白, 富含带正电荷的精氨酸( Arg ) 和赖氨酸( Lys ) 等碱 性氨基酸。_学小易找答案...
  20. HHT和FFT的对比

热门文章

  1. PS网页设计教程——小贴士:在PS中创建复古的页面
  2. CListCtrl 使用(转)
  3. JS:ES6-8 Promise入门
  4. Linux---信号及其使用简单讲解
  5. 【零基础学Java】—Random的基本概述和使用(十二)
  6. 句句真研—每日长难句打卡Day18
  7. 为什么现在的很多酒店都不收押金,只收房费了?
  8. 有哪些闷声发大财的行业?
  9. 全职写作过来人,给初学写作者的6条忠告
  10. 成功的本质是——做减法