作者:孔德雨

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

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

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

通過(guò)

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

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

2d索引的理論

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

如下圖:

很顯然的,一個(gè)2bits的