作者:孔德雨
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索引可以表達兩種含義,而不同的含義是在查詢時被理解的,而不是在索引創(chuàng)建時。
2d索引的理論
Mongodb 使用一種叫做Geohash的技術(shù)來構(gòu)建2d索引,但是Mongodb的Geohash并沒有使用國際通用的每一層級32個grid的Geohash描述方式(見wiki geohash)。而是使用平面四叉樹的形式。
如下圖:
很顯然的,一個2bits的