作者:孔德雨
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)查詢(xún)一個(gè)索引,其中spherical:true|false 表示應(yīng)該如何理解創(chuàng)建的2d索引,false表示將索引理解為平面2d索引,true表示將索引理解為球面經(jīng)緯度索引。這一點(diǎn)比較有意思,一個(gè)2d索引可以表達(dá)兩種含義,而不同的含義是在查詢(xún)時(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的