赞
踩
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)结果如下
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。