4.4 地理空间索引
在移动互联网时代,基于地理位置的检索(LBS)功能几乎是所有应用系统的标配。
MongoDB为地理空间检索提供了非常方便的功能。地理空间索引(2dsphere index)就是专门用于实现位置检索的一种特殊索引。
下面来看一个案例。
在生活节奏逐渐加快的今天,我们已经习惯了使用在线订餐的APP。在挑选外卖商家时,除了餐食的口味、评价、优惠力度,还有一个几乎所有人都要考虑的因素,就是距离。因此,在订餐APP上呈现的商家检索通常都会有地理位置的限制,例如仅查询5千米内的商家。
那么,通过MongoDB如何实现“查询附近商家”这种功能呢?
首先,假设商家的数据模型如下:
location字段是一个内嵌型文档,用于表明商家的地理位置,其中的type表示这是地图上的一个点,coordinates则是经纬度。
接着,创建一个2dsphere索引,代码如下:
最后,执行查询,实现检索附近5千米内的商家,代码如下:
这里使用了$near查询操作符,用于实现附近商家的检索,返回数据结果会按距离排序。
其中,$geometry操作符用于指定一个GeoJSON格式的地理空间对象,type=Point表示地理坐标点,coordinates则是用户当前所在的经纬度位置;$maxDistance限定了最大距离,单位是米。
综上所述,MongoDB实现地理空间检索需考虑的因素如下:
● 地理空间对象的存储,如location(地理位置)。
● 创建地理空间索引。
● 使用合适的地理位置操作符实现检索。
除此之外,MongoDB还可以实现一些更为强大的地理空间计算,比如区域的交集等。而地理空间对象也不局限于位置点(location point),具体类型由GeoJSON对象定义。
注意:
(1)MongoDB的地理空间检索基于WGS84坐标系,在与一些地图平台集成时需要注意转换,如GCJ-02(火星坐标系)、BD-09(百度中国坐标系)等。
(2)MongoDB 4.0版本之后,near可以用于分片集合(sharded collection),而在此版本之前可以使用geoNear聚合操作来代替。