作者:孔德雨

MongoDB的geo索引是其一大特色,本文從原理層面講述geo索引中的2d索引的實現(xiàn)。

2d 索引的創(chuàng)建與使用

通過 db.coll.createIndex({"lag":"2d"}, {"bits":int})) 來創(chuàng)建一個2d索引,索引的精度通過bits來指定,bits越大,索引的精度就越高。更大的bits帶來的插入的overhead可以忽略不計。

通過

db.runCommand({ 
    geoNear: tableName, 
    maxDistance: 0.0001567855942887398, 
    distanceMultiplier: 6378137.0, 
    num: 30, 
    near: [ 113.8679388183982, 22.58905429302385 ], 
    spherical: true|false})

來查詢一個索引,其中spherical:true|false 表示應(yīng)該如何理解創(chuàng)建的2d索引,false表示將索引理解為平面2d索引,true表示將索引理解為球面經(jīng)緯度索引。這一點比較有意思,一個2d索引可以表達(dá)兩種含義,而不同的含義是在查詢時被理解的,而不是在索引創(chuàng)建時。

2d索引的理論

Mongodb 使用一種叫做Geohash的技術(shù)來構(gòu)建2d索引,但是Mongodb的Geohash并沒有使用國際通用的每一層級32個grid的Geohash描述方式(見wiki geohash)。而是使用平面四叉樹的形式。

如下圖:

很顯然的,一個2bits的