当前的实现在标准 MongoDB B 树上编码地理哈希码。$near 查询的结果是准确的。这种编码的一个限制虽然很快,但前缀查找并不能给出准确的结果,尤其是在位翻转区域附近。MongoDB 通过在初始前缀扫描之后进行网格邻居搜索来解决这个问题,以获取任何散乱的点。这通常可以确保在提供正确结果的同时保持非常高的性能。
这是否意味着 mongodb 将地球分成几个网格?
当前的实现在标准 MongoDB B 树上编码地理哈希码。$near 查询的结果是准确的。这种编码的一个限制虽然很快,但前缀查找并不能给出准确的结果,尤其是在位翻转区域附近。MongoDB 通过在初始前缀扫描之后进行网格邻居搜索来解决这个问题,以获取任何散乱的点。这通常可以确保在提供正确结果的同时保持非常高的性能。
这是否意味着 mongodb 将地球分成几个网格?
Greg Studer (10gen) 的此演示文稿详细讨论了地理空间索引: Geospatial Indexing with MongoDB。
MongoDB 2.2 中的标准地理空间实现使用 2-D GeoHash方法,精度可变:
By default, precision is set to 26 bits which is equivalent to approximately
2 feet given (longitude, latitude) location values and default (-180, 180)
bounds.
GeoHash 方法确实存在一些边缘情况,其中一些点可能在空间上很接近,但具有不同的哈希值。MongoDB 还包括一个地理空间干草堆索引,该索引专门针对具有一个附加索引标准的小区域“近”长/纬度搜索进行了调整(例如:“查找 25 英里内名称为 'foo' 的所有餐厅”)。
Nicholas Knize (Thermopylae) 的另一个有趣的演示将当前的 B-tree / GeoHash 方法与R-trees进行了对比。如果您向前跳到幻灯片 8,有一个可视化的解释可能会有所帮助: RTree Spatial Indexing with MongoDB - MongoDC。