89 lines
2.7 KiB
Markdown
89 lines
2.7 KiB
Markdown
---
|
|
title: 3.2、地理位置索引
|
|
date: 2017-12-19 19:11:32
|
|
tags:
|
|
- 数据库
|
|
- MongoDB
|
|
- 索引
|
|
categories:
|
|
- MongoDB
|
|
---
|
|
概念 : 将一些点的位置存储在MongoDB当中
|
|
创建索引后 , 可以按照位置来查找其他点
|
|
<!-- more -->
|
|
|
|
子分类
|
|
1. 2D索引 , 用于存储和查找平面上的点
|
|
2. 2Dsphere索引 , 用于存储和查找球面上的点
|
|
|
|
查找方式
|
|
1. 查找距离某个点一定距离内的点
|
|
2. 查找包含在某区域内的点
|
|
|
|
#### 2D索引
|
|
位置使用经纬度两个值构成的数组来表示
|
|
取值范围 : 经度 [-180 , 180] , 纬度 [-90 , 90]
|
|
|
|
##### 添加2d索引
|
|
```
|
|
db.集合名称.ensureIndex( { 字段名 : "2d" } )
|
|
```
|
|
添加该索引之后 , 向该集合当中插入的数据 , 如果该字段不符合经纬度的要求 , 就会报错
|
|
|
|
##### 查询方式
|
|
`$near` 查询距离某个点距离最近的点 , 并且从近到远排列 , 默认至多返回100条数据
|
|
|
|
如果一个集合当中已有了如下的数据 , 并且已添加2d索引
|
|

|
|
执行查询
|
|
`.find({w:{$near:[50,50]}}) `
|
|
获得的结果如下
|
|

|
|
如果要查询检索的范围
|
|
可以用$maxDistance 和 $minDistance操作符
|
|
表示最远距离和最近距离 , 不在这个范围内的点将会被过滤掉
|
|

|
|
|
|
> 也可以使用`db.runCommand`方法 , 这个方法可以有更加详细的参数和返回结果
|
|
比如 **db.runCommand({getNear:”test”,near:[5,5],manDistance:20,num:3}**
|
|
返回的结果可以获得符合要求的点与指定点的距离 , 以及平均距离等数据
|
|
|
|
##### `$geoWithin`查询某个形状内的点
|
|
1. `$box:[ [x1, y1] , [x2 , y2] ]` 表示矩形 , 参数分别表示左下坐标和右上坐标
|
|
2. `$center :[[x1,y1] , r]` 表示圆形 , 参数是圆心和半径
|
|
3. `$polygon : [[x1,y1],[x2,y2] ...]` 表示多边形 , 参数为多边形每个顶点的坐标
|
|
|
|
例如 **.find({w:{$geoWithin:{$box:[[1,1],[50,50]]}}})**
|
|
其他两种方式用法同理
|
|
|
|
|
|
#### 2Dsphere索引
|
|
球面地理位置索引
|
|
创建方式
|
|
```
|
|
db.集合名称.ensureIndex({w:"2dsphere"})
|
|
```
|
|
但是在这个索引对应的字段当中
|
|
数据就要使用GeoJSON来表示
|
|
格式如下
|
|
```
|
|
{type:"",coordinates:[<coorinates>]}
|
|
```
|
|
> 关于GeoJSON的详细规范 , 参考下一篇笔记
|
|
|
|
##### 查询
|
|
举例 : 查询一个多边形当中的所有位置
|
|
```json
|
|
{ w:
|
|
{ $geoWithin :
|
|
{ $geometry :
|
|
{
|
|
type : "Polygon" ,
|
|
coordinates : [[[0,0],[3,6],[6,1],[0,0]]]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
+ `$geoIntersects`区域交叉 , 查询与多边形相交的所有的点和形状
|
|
+ `$near`临近 , 与2D索引类似 |