LBS(Location Based Services)定位服务,即根据用户位置查询用户附近相关信息,这一功能在很多应用上都有所使用。基于用户位置进行查询时,需要提供用户位置的经纬度。为了提高查询速度,MongoDB为坐标平面查询提供了专门的索引,称作地理空间(2d)索引。

1. 创建地理空间索引

地理空间索引又称为2d索引。创建其它形式的索引,我们会按升序或降序(1或-1)的形式创建索引,不同于其它形式的索引,创建地理空间索引要指定的值为:2d。语法结构如下:

db.<collection>.createIndex({
<location field> : "2d" ,
<additional field> : <value> } ,
{ <index-specification options>})

location field:要创建地理空间索引的字段(键)
additional field:附加字段(键)
index-specification options:索引选项
index-specification options是一个包含以下可选值的子文档:

{ min : <lower bound>, max : <upper bound>, bits : <bit precision> }

min bound:{number},最低范围,默认-180.0
max bound:{number},最高范围,默认180.0
bit precision:{integer},存储数据Geohash值精度,取值:1〜32,默认26

地理空间计算本质上是二维数据计算,创建索引地理空间索引时,索引键的值必须是一对值:一个包含两个数值的数组或包含两个键的内嵌文档(内嵌文档键的名称不重要)。

以下几种健值形式,都可以创建地理空间索引:

// 数组
{"gps": [, ]}
// 包含两个键的内嵌文档
{"gps": { "x":, "y":}}
{"gps": { "latitude":, "longitude":}}

我们可以对上面的"gps"健创建地理空间索引:

db.userlocation.ensureIndex({"gps" : "2d"}, {"min":-, "max":});  

这样我们就创建了地理空间索引值范围为-1000〜1000的索引。

2. 使用地理空间索引查询

2.1 $near接近点查询

通过$near关键字,可以根据一个指定的平面点,按距离排序返回查询结果:

db.<collection>.find({
<location field> :{
$near : [ <x>, <y>],
$maxDistance : <distance in meters<,
$mixDistance : <distance in meters<
}
})

$near表示要查询的中心点
$maxDistance距中心点的最大距离
$minDistance距中心点的最小距离
如,查询距离坐标点(40,120),10公里以内的数据:

db.userlocation.find({
gps : {
$near : [, ],
$maxDistance :
}
})

2.2 $geoWithin指定形状查询
MongoDB不仅可以按坐标点查询,还可以在查询指定形状内的文档。按形状查询使用$geoWithin(在v2.4之前使用$within):

db.<collection<.find({
<location field> :{
$geoWithin : { $box|$polygon|$center : <coordinates>}
}
})

在指定形状查询中,$box、$polygon、$center分别表示按矩形、五边形、圆形进行查询。
如,查询坐标点为(40,120),半径为10以内的文档:

db.userlocation.find({
gps : {
$geoWithin : {
$center:[[, ], ]
}
}
})

最新文章

  1. 转一下关于struct字对齐的原因
  2. 一些对新手有用的css技巧
  3. [AngularJS] 使用AngularCSS动态加载CSS
  4. AngularJS指令嵌套时link函数执行顺序的问题
  5. db2操作 连接、备份、恢复db2
  6. [ZZ] D3D中的模板缓存(3)
  7. yaf框架流程一
  8. tachyon 初识
  9. Linux堆内存管理深入分析
  10. Oracle DECODE函数的语法介绍
  11. IO流基础加强
  12. 入门1:PHP的优点
  13. 菜单栏始终浮动在顶部 js
  14. python_day06(ip代理池)
  15. win32控制台程序 宽字符与短字符转化
  16. [转]NET Core静态文件的缓存方式
  17. c# 上传图片流,php端(laravel框架)接收处理方法
  18. 关于页面的跳转添加参数(比如id啥的)
  19. PHP Jquery 代码操作 内容 属性 样式 事件 Json数据
  20. tomcat7 安装 windows 服务

热门文章

  1. git中常混淆的操作
  2. NIO-WindowsSelectorImpl源码分析
  3. Spring Boot自动配置如何工作
  4. css常用样式对文本的处理演练
  5. css常用样式font控制字体的多种变换
  6. Linux报错:rm: cannot remove &#39;xxx&#39;: Is a directory
  7. KVM-virsh 创建虚拟网络
  8. 硬件知识整理part1--电阻E系列行业规范
  9. qt creator源码全方面分析(2-2)
  10. opencv —— 在 VS 中的配置