MongoDB 对于坐标数据的文档提供了地理空间索引。使用该索引,可以通过坐标高效地查询到对应文档。下面介绍地理空间索引的两种类型。
 

(1) 2dsphere :此索引类型支持查询地球球体上的位置,支持"GEOJSON"和专统坐标类型
的数据。
* GeoJSON数据:需要使用嵌入式文档。在其中可以通过“coordinates”字段来指定坐标位置,以及可以通过“type”字段来指定坐标的类型。type可以分3中形式

点(Point):若“type”为“Point”,则“coordinates”字段只有一个坐标

线(LineString):若“type”为“LineString”,则“coordinates”字段会有两个坐标

多边形(Polygon):若“type”为“Polygon”,则“coordinates”字段会有两个以上的坐标

* 传统坐标数据:只需要一个字段指定坐标的位置

无论是GeoJSON 数据还是传统坐标数据,真中经纬度的存储方式必须是数组形式,即[经度,纬度],且经纬度必须有效,如果经纬度的存储位置颠倒,或者无效,创建时会报错

(2) 2d:此索引类型支持查询二维平面上的位置,仅支持传统坐标类型的数据。

1. 创建空间地理索引

范例1 

在GeoJSON类型的文档中使用2dsphere 类型的索引

(1)首先创建一个GeoJSON类型的文档。

db.getCollection("Warehouse").insert({
    SysNo: 1001,
    name: "东软",
    address: "沈 阳市浑南区新秀街(东软软件园)",
    location: {
        type: "Point",
        coordinates: [123.436716, 41.706877]
    }
})

(2)创建2dsphere的地理空间索引

db.Warehouse.createIndex({location:"2dsphere"})

范例2

在传统坐标类型的数据中使用“2d”类型的索引。

(1)创建一个符合传统坐标类型格式的文档

db.getCollection("Warehouse_2").insert({
    SysNo: 1021,
    name: "东软",
    address: "沈 阳市浑南区新秀街(东软软件园)",
    coordinates: [123.436716, 41.706877]
})

(2)创建“2d”地理空间索引

db.Warehouse_2.createIndex({"coordinates":"2d"});

2.使用“$geoNear”操作符查询文档

在索引创建完成后,用“ $geoNear”操作符可以把指定坐标到文档中坐标的距离由近到远地排列出
来, 并设定“distanceField”参数显示两者之间的距离。其中需注意的是,从MongoDB4.0 版本开始,用“ $geoNear”操作符并设定“ key”参数,就可以查询集合中同时拥有“ 2dsphere”及“2d”的地
理空间索引的文挡。

范例1

$geoNear查询2dsphere类型的文档

(1)使用之前在“ location”字段上建立的2dsphere索引,查询指定坐标[123.450991,41.717795]与文挡之间的距离,并按照距离由近到远地呈现,具体指令如下。

db.Warehouse.aggregate(
    [{
        $geoNear: {
            near: {
                type: "Point",
                coordinates: [123.450991, 41.717795]
            },
            distanceField: "dist.location",
            key: "location"
        }
    }
    ]
)

(2)查询结果如下,dist是指定坐标与文档中坐标的距离

 

范例2

$geoNear查询2d类型的文档

(1)用在“coordinates”字段上建立的2d索引的文档,查询指定坐标[123.450991,41.717795]与文挡之间的距离,并按照距离由近到远地呈现,具体指令如下。

db.Warehouse_2.aggregate(
    [{
        $geoNear: {
            near: [123.450991, 41.717795]
            ,
            distanceField: "dist.location",
            key: "coordinates"
        }
    }]
)

(2)结果如下

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐