地理位置索引支持是MongoDB的一大亮點,這也是全球最流行的LBS服務foursquare 選擇MongoDB的緣由之一。咱們知道,一般的數據庫索引結構是B+ Tree,如何將地理位置轉化爲可創建B+Tree的形式,下文將爲你描述。html
首先假設咱們將須要索引的整個地圖分紅16×16的方格,以下圖(左下角爲座標0,0 右上角爲座標16,16):sql
單純的[x,y]的數據是沒法創建索引的,因此MongoDB在創建索引的時候,會根據相應字段的座標計算一個能夠用來作索引的hash值,這個值叫作geohash,下面咱們以地圖上座標爲[4,6]的點(圖中紅叉位置)爲例。mongodb
咱們第一步將整個地圖分紅等大小的四塊,以下圖:數據庫
劃分紅四塊後咱們能夠定義這四塊的值,以下(左下爲00,左上爲01,右下爲10,右上爲11):nosql
01 | 11 |
00 | 10 |
這樣[4,6]點的geohash值目前爲 00spa
而後再將四個小塊每一塊進行切割,以下:htm
這時[4,6]點位於右上區域,右上的值爲11,這樣[4,6]點的geohash值變爲:0011blog
繼續往下作兩次切分:索引
最終獲得[4,6]點的geohash值爲:00110100get
這樣咱們用這個值來作索引,則地圖上點相近的點就能夠轉化成有相同前綴的geohash值了。
咱們能夠看到,這個geohash值的精確度是與劃分地圖的次數成正比的,上例對地圖劃分了四次。而MongoDB默認是進行26次劃分,這個值在創建索引時是可控的。具體創建二維地理位置索引的命令以下:
db.map.ensureIndex({point : "2d"}, {min : 0, max : 16, bits : 4})
其中的bits參數就是劃分幾回,默認爲26次。
原文出處:http://blog.nosqlfan.com/html/1811.html