- MongoDB官方文档中文版
- MongoDB中文手册说明
- MongoDB简介
- 安装 MongoDB
- The mongo Shell
- MongoDB CRUD 操作
- 聚合
- 数据模型
- 事务
- 索引
- 安全
- 安全检查列表
- 启用访问控制
- 身份验证
- 基于角色的访问控制
- TLS / SSL(传输加密)
- 静态加密
- 客户端字段级加密
- 审计
- 网络和配置强化
- 实现字段级别修订
- 安全参考
- 附录
- 变更流
- 复制
- 分片
- 分片键
- 哈希分片
- 范围分片
- 区
- 管理分片区
- 按位置细分数据
- 用于更改SLA或SLO的分层硬件
- 按应用或客户细分数据
- 仅插入工作负载的分布式本地写入
- 管理分片区
- 使用块进行数据分区
- 在分片集群中拆分数据块
- 管理
- 存储
- 存储引擎
- 日志记录
- 管理日志记录
- GridFS
- FAQ:MongoDB 存储
- 存储引擎
- 参考
- 运算符
- 查询与映射运算符
- 更新运算符
- 聚合管道阶段
- 聚合管道操作符
- $abs (aggregation)
- $acos (aggregation)
- $acosh (aggregation)
- $add (aggregation)
- $addToSet (aggregation)
- $allElementsTrue (aggregation)
- $and (aggregation)
- $anyElementTrue (aggregation)
- $arrayElemAt (aggregation)
- $arrayToObject (aggregation)
- $asin (aggregation)
- $asinh (aggregation)
- $atan (aggregation)
- $atan2 (aggregation)
- $atanh (aggregation)
- $avg (aggregation)
- $ceil (aggregation)
- $cmp (aggregation)
- $concat (aggregation)
- $concatArrays (aggregation)
- $cond (aggregation)
- $convert (aggregation)
- $cos (aggregation)
- $dateFromParts (aggregation)
- $dateToParts (aggregation)
- $dateFromString (aggregation)
- $literal (aggregation)
- 查询修饰符
- 数据库命令
- 聚合命令
- 地理空间命令
- 查询和写操作命令
- 查询计划缓存命令
- 认证命令
- 用户管理命令
- 角色管理命令
- 复制命令
- 分片命令
- 会话命令
- 管理命令
- 诊断命令
- 免费监控命令
- 系统事件审计命令
- mongo Shell 方法
- 集合方法
- db.collection.aggregate()
- db.collection.bulkWrite()
- db.collection.copyTo()
- db.collection.count()
- db.collection.countDocuments()
- db.collection.estimatedDocumentCount()
- db.collection.createIndex()
- db.collection.createIndexes()
- db.collection.dataSize()
- db.collection.deleteOne()
- db.collection.deleteMany()
- db.collection.distinct()
- db.collection.drop()
- db.collection.dropIndex()
- db.collection.dropIndexes()
- db.collection.ensureIndex()
- db.collection.explain()
- db.collection.find()
- db.collection.findAndModify()
- db.collection.findOne()
- db.collection.findOneAndDelete()
- db.collection.findOneAndReplace()
- db.collection.findOneAndUpdate()
- db.collection.getIndexes()
- db.collection.getShardDistribution()
- db.collection.getShardVersion()
- db.collection.insert()
- db.collection.insertOne()
- db.collection.insertMany()
- db.collection.isCapped()
- db.collection.latencyStats()
- db.collection.mapReduce()
- db.collection.reIndex()
- db.collection.remove()
- db.collection.renameCollection()
- db.collection.replaceOne()
- db.collection.save()
- db.collection.stats()
- db.collection.storageSize()
- db.collection.totalIndexSize()
- db.collection.totalSize()
- db.collection.update()
- db.collection.updateOne()
- db.collection.updateMany()
- db.collection.watch()
- db.collection.validate()
- 词汇表
- 默认的MongoDB端口
- 默认的MongoDB读/写关注
- 服务器会话
- MongoDB驱动
- FAQ
- 联系我们
- 更多资料
- [快学Mongo]
- [Mongo问题讨论区]
- [Mongo 驱动使用手册]
- 本书使用 GitBook 发布
用地理空间查询查找餐馆
用地理空间查询查找餐馆
在本页面
总览
MongoDB的地理空间索引使您可以高效地对包含地理空间形状和点的集合执行空间查询。为了展示地理空间要素的功能并比较不同的方法,本教程将指导您完成为简单地理空间应用程序编写查询的过程。
本教程将简要介绍地理空间索引的概念,然后演示它们在$geoWithin
, $geoIntersects
, 和 $nearSphere
.中的用法。
假设您正在设计一个移动应用程序,以帮助用户找到纽约市的餐馆。该应用程序必须:
使用
$geoIntersects
确定用户当前所在的社区使用
$geoWithin
显示附近的餐馆数量,使用
$nearSphere
在用户指定距离内查找餐馆
本教程将使用2dsphere索引来查询有关球形几何的数据。
有关球面和平面几何的更多信息,请参见Geospatial Models.
失真
由于将三维球体(例如地球)投影到平面上的性质,当在地图上可视化时,球形几何形状将显得失真。
例如,以经度纬度点(0,0)
, (80,0)
, (80,80)
, and (0,80)
. 定义的球形正方形的规格为例。下图描述了此区域覆盖的区域:
搜索餐厅
前提条件
下载数据集后,将它们导入数据库:
mongoimport <path to restaurants.json> -c=restaurants
mongoimport <path to neighborhoods.json> -c=neighborhoods
地理空间索引,几乎总是可以提高$geoWithin
and $geoIntersects
查询的性能。
由于此数据是地理数据,因此请使用mongo
shell在每个集合上创建2dsphere索引:
db.restaurants.createIndex({ location: "2dsphere" })
db.neighborhoods.createIndex({ geometry: "2dsphere" })
探索数据
从mongo
shell中检查新创建的餐厅集合中的条目:
db.restaurants.findOne()
该查询返回如下文档:
{
location:
type: "Point",
coordinates: [-73.856077, 40.848447]
},
name: "Morris Park Bake Shop"
}
该餐厅文档对应于下图所示的位置:
由于本教程使用2dsphere索引,因此location字段中的几何数据必须遵循GeoJSON 格式.
现在检查neighborhoods集合中的条目:
db.neighborhoods.findOne()
该查询将返回如下文档:
{
geometry:
type: "Polygon",
coordinates: [[
[ -73.99, 40.75 ],
...
[ -73.98, 40.76 ],
[ -73.99, 40.75 ]
]]
},
name: "Hell's Kitchen"
}
该几何形状对应于下图所示的区域:
找到当前的街区
假设用户的移动设备可以为用户提供相当准确的位置,那么使用$geoIntersects
.很容易找到用户当前的街区。
假设用户位于经度-73.93414657和纬度40.82302903。 要找到当前邻域,您将使用GeoJSON格式的特殊$geometry字段指定一个点:
db.neighborhoods.findOne({ geometry: { $geoIntersects: { $geometry: { type: "Point", coordinates: [ -73.93414657, 40.82302903 ] } } } })
该查询将返回以下结果:
{
"_id" : ObjectId("55cb9c666c522cafdb053a68"),
"geometry" :
"type" : "Polygon",
"coordinates" : [
[
[
-73.93383000695911,
40.81949109558767
],
...
]
]
},
"name" : "Central Harlem North-Polo Grounds"
}
查找附近的所有餐厅
您还可以查询以查找给定社区中包含的所有餐馆。 在mongo shell中运行以下命令以查找包含用户的社区,然后计算该社区内的餐馆:
var neighborhood = db.neighborhoods.findOne( { geometry: { $geoIntersects: { $geometry: { type: "Point", coordinates: [ -73.93414657, 40.82302903 ] } } } } )
db.restaurants.find( { location: { $geoWithin: { $geometry: neighborhood.geometry } } } ).count()
该查询将告诉您,所请求的社区中有127家餐厅,如下图所示:
查找附近的餐厅
要查找点指定距离内的餐厅,可以将$geoWithin
与 $centerSphere
一起按未排序的顺序返回结果,或者如果需要按距离对结果进行排序,则可以将NearSphere与$maxDistance
一起返回。
未排序$geoWithin
要查找圆形区域内的餐厅,请将$geoWithin
与$centerSphere
一起使用。 $centerSphere
.是MongoDB特定的语法,它通过以弧度指定中心和半径来表示圆形区域。
$geoWithin
不会以任何特定顺序返回文档,因此它可能会首先向用户显示最远的文档。
以下内容将查找距用户五英里范围内的所有餐馆:
db.restaurants.find({ location:
{ $geoWithin:
{ $centerSphere: [ [ -73.93414657, 40.82302903 ], 5 / 3963.2 ] } } })
’s的第二个参数接受以弧度为单位的半径,因此您必须将其除以以英里为单位的地球半径。 有关在距离单位之间进行转换的更多信息,请参见使用球面几何计算距离 。
用$nearSphere排序
您也可以使用$nearSphere
并以米为单位指定$maxDistance
项。 这将按照从最近到最远的排序顺序返回用户五英里范围内的所有餐馆:
var METERS_PER_MILE = 1609.34
db.restaurants.find({ location: { $nearSphere: { $geometry: { type: "Point", coordinates: [ -73.93414657, 40.82302903 ] }, $maxDistance: 5 * METERS_PER_MILE } } })
译者:杨帅
校对:杨帅
Copyright © 上海锦木信息技术有限公司 all right reserved,由 MongoDB汉化小组 提供技术支持文件修订时间: 2020-10-11 20:53:05