MongoDB地理空间(2d)索引创建与查询

摘要:
为了提高查询速度,MongoDB为坐标平面查询提供了一种特殊的索引,称为地理空间索引。语法结构如下:dbCreateIndexrocationfield:field(key)additionalfield:additional field(key)索引规范options:index options索引规范options是一个子文档,包含以下可选值:{min:,max:,bits:}minbound:{number},最低范围,默认-180.0 maxbound:{number},最高范围,默认180.0位精度:{integer},存储数据的Geohash值的精度为132。默认情况下,26地理空间计算基本上是二维数据计算。创建索引地理空间索引时,索引键的值必须是一对值:包含两个值的数组或包含两个键的嵌入文档。

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": [40, 120]}
// 包含两个键的内嵌文档
{"gps": { "x":40, "y":120}}
{"gps": { "latitude":40, "longitude":120}}

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

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

这样我们就创建了地理空间索引值范围为-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 : [40, 120],
    $maxDistance : 10
  }
})

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:[[40, 120], 10]
    }
  }
})

免责声明:文章转载自《MongoDB地理空间(2d)索引创建与查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇u盘启动盘安装centos7.5操作系统3D打印机开源、免费分层软件介绍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Apache Solr初体验一

由于工作原因,这段时间接触到solr,一个基于lucene的企业级搜索引擎。不怎么了解它的童鞋可以去GOOGLE一下。     下面开始正题:     1)要开始solr的学习,首先当然是要下载它啦(这是一句废话),可以到http://www.apache.org/dyn/closer.cgi/lucene/solr/这里去下载,最新的是1.4.1(现在已...

MongoDB学习笔记-2(使用java连接Mongo)

本人使用maven创建的java工程,mongo-java-driver使用的是3.2.2,这个驱动2.x和3.x是有差异的 pom.xml配置加入: <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</a...

MongoDB中导出数据为csv文件

1. 打开命令行; 2. 输入如下指令(确保数据库是开着的,下面的数据库名称和集合名称以及域的名称可以根据需求修改) mongoexport -d myDB -c user -f _id,name,password,adress --csv -o ./user.csv 3. 说明: mongoexport -d myDB(myDB修改成...

mongodb之增删改查

目录 概述 方法 构造方法 getInstance方法 initMongo方法 getCollection(MongoColl mongoColl)方法 向mongodb添加数据 更新mongodb中的数据 更新操作符 $set $inc $mul $rename 删除mongodb中的数据 查找数据 概述 该类是emessage...

MongoDB查询报错:class com.mongodb.MongoSecurityException: Exception authenticating MongoCredential

异常日志: 2019-05-30 10:10:24,252 [http-nio-8080-exec-1] DEBUG [java.sql.Connection] -ooo Connection Opened 2019-05-30 10:10:24,258 [http-nio-8080-exec-1] DEBUG [java.sql.PreparedSta...

nodejs入门

目录: 一、关于nodejs   Node.js (http://nodejs.org/)是一个基于Chrome JavaScript 运行时建立的一个平台, 用来方便地搭建快速的, 易于扩展的网络应用。Node.js 借助事件驱动, 非阻塞 I/O 模型变得轻量和高效, 非常适合 run across distributed devices 的 data...