- 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支持对地理空间数据的查询操作。 本节介绍MongoDB的地理空间功能。
地理空间数据
在MongoDB中,您可以将地理空间数据存储为GeoJSON 对象或遗留坐标对。
GeoJSON对象
要计算类地球体的几何形状,请将位置数据存储为GeoJSON 对象。
要指定GeoJSON数据,请使用嵌入的文档:
一个名为type的字段,用于指定GeoJSON对象类型
一个名为坐标的字段,用于指定对象的坐标。
如果指定纬度和经度坐标,请先列出经度,然后再列出纬度:
有效的经度值在-180到180之间(包括两者)。
有效的纬度值在-90到90之间(包括两者之间)。
<field>: { type: <GeoJSON type> , coordinates: <coordinates> }
例如,要指定GeoJSON Point::
location: {
type: "Point",
coordinates: [-73.856077, 40.848447]
}
有关MongoDB支持的GeoJSON对象的列表以及示例,请参阅GeoJSON 对象。
对GeoJSON对象的MongoDB地理空间查询是在球体上计算的; MongoDB使用WGS84参考系统对GeoJSON对象进行地理空间查询。
旧版坐标对
在欧几里德平面上计算距离,请将您的位置数据存储为旧坐标对并使用2d
索引。 通过将数据转换为GeoJSON Point类型,MongoDB支持通过2dsphere
索引对旧坐标对进行球面计算。
要将数据指定为旧版坐标对,可以使用数组(首选)或嵌入式文档。
通过数组指定(首选):
<field>: [ <x>, <y> ]
如果指定纬度和经度坐标,请先列出经度,然后再列出纬度; 即:
<field>: [<longitude>, <latitude> ]
有效的经度值在[-180 180]。
有效的纬度值在[-90 90]。
通过嵌入式文档指定:
<field>: { <field1>: <x>, <field2>: <y> }
如果指定纬度和经度坐标,第一个字段必须包含经度值,而第二个字段必须包含纬度值;即。
<field>: { <field1>: <longitude>, <field2>: <latitude> }
- 有效的经度值在[-180 180]。
- 有效的纬度值在[-90 90]。
为了指定旧版坐标对,数组比嵌入式文档更可取,因为某些语言不能保证关联地图的排序。
地理空间索引
MongoDB提供以下地理空间索引类型以支持地理空间查询。
2dsphere
索引支持查询,该查询可在类似地球的球体上计算几何形状。
要创建2dsphere索引,请使用db.collection.createIndex()
方法并指定字符串文字“ 2dsphere”作为索引类型:
db.collection.createIndex( { <location field> : "2dsphere" } )
其中<location field
>是其值为GeoJSON对象或旧版坐标对的字段。
有关2dsphere索引的更多信息,请参见2dsphere
索引。
2d
索引支持在二维平面上计算几何的查询.尽管索引可以支持在球上进行计算的$nearSphere
查询,但如果可能,请对球面查询使用2dsphere索引。
要创建2d索引,请使用db.collection.createIndex()
方法,将location字段指定为键,并将字符串文字“ 2d”指定为索引类型:
db.collection.createIndex( { <location field> : "2d" } )
其中<location field
>是一个值为旧版坐标对的字段。
有关2d索引的更多信息,请参见2d 索引。
地理空间索引和分片集合
分片集合时,不能将地理空间索引用作分片键。但是,可以通过使用不同的字段作为分片键在分片集合上创建地理空间索引。
分片集合支持以下地理空间操作:
$geoNear聚集阶段
$near和$nearSphere查询运算符(从MongoDB 4.0开始).
从MongoDB 4.0开始,分片集合支持$near
和 $nearSphere
查询。
在早期的MongoDB版本中,分片集合不支持$near
和 $nearSphere
查询。相反,对于分片群集,必须使用$geoNear
聚合阶段或geoNear命令(在MongoDB 4.0及更低版本中可用)。
您还可以使用$geoWithin
和$geoIntersect查询分片群集的地理空间数据。
涵盖查询
地理空间查询
[success] Note
对于球形查询,请使用2dsphere索引结果。
将2d索引用于球形查询可能会导致错误的结果,例如将2d索引用于环绕两极的球形查询。
地理空间查询操作符
MongoDB提供以下地理空间查询操作符:
名字 | 说明 |
---|---|
$geoIntersects | 选择与GeoJSON几何形状相交的几何形状。 2dsphere 索引支持$geoIntersects . |
$geoWithin | 选择边界GeoJSON几何图形内的几何图形。2dsphere 和2d索引支持$geoWithin . |
$near | 返回球体上某个点附近的地理空间对象。 需要地理空间索引。 2dsphere 和2d索引支持$near . |
$nearSphere | 返回接近球体上某一点的地理空间对象。需要地理空间索引。2dsphere 和2d索引支持$nearSphere . |
有关更多细节(包括示例),请参见个别参考页面。
地理空间聚集阶段
MongoDB提供以下地理空间聚合管道阶段:
步骤 | 说明 |
---|---|
$geoNear | 根据与地理空间点的接近程度返回有序的文档流。 合并了地理空间数据的$match , $sort , 和 $limit 功能。 输出文档包括附加距离字段,并且可以包括位置标识符字段。
$geoNear 需要一个地理空间索引。 |
有关更多详细信息(包括示例),请参见$geoNear参考页。
地理空间模型
MongoDB地理空间查询可以解释平面或球体上的几何。
2dsphere索引仅支持球形查询(即解释球形表面几何形状的查询)。
2d索引支持平面查询(即解释平面上的几何图形的查询)和某些球形查询。 虽然2d索引支持某些球形查询,但是将2d索引用于这些球形查询可能会导致错误。 如果可能,请对球形查询使用2dsphere索引。
下表列出了每个地理空间操作所使用的地理空间查询运算符,受支持的查询:
操作方式 | 球面/平面查询 | 笔记 |
---|---|---|
$near (GeoJSON centroid point in this line and the following line, 2dsphere index) | 球形 | 另请参见 $nearSphere 运算符,该运算符与GeoJSON和2dsphere索引一起使用时提供相同的功能。 |
$near (legacy coordinates, 2d index) | 平面 | |
$nearSphere (GeoJSON point, 2dsphere index) | 球形 | 提供与使用GeoJSON点和2dsphere索引的$ near操作相同的功能。对于球形查询,最好使用$ nearSphere而不是$ near运算符,后者在名称中显式指定球形查询。 |
$nearSphere (legacy coordinates, 2d index) | 球形 | 请改用GeoJSON 点。 |
$geoWithin : { $geometry: … } | 球形 | |
$geoWithin : { $box: … } | 平面 | |
$geoWithin : { $polygon: … } | 平面 | |
$geoWithin : { $center: … } | 平面 | |
$geoWithin : { $centerSphere: … } | 球形 | |
$geoIntersects | 球形 | |
$geoNear aggregation stage (2dsphere index) | 球形 | |
$geoNear aggregation stage (2d index) | 平面 |
例子
用以下文档创建一个集合places:
db.places.insert( {
name: "Central Park",
location: { type: "Point", coordinates: [ -73.97, 40.77 ] },
category: "Parks"
} );
db.places.insert( {
name: "Sara D. Roosevelt Park",
location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] },
category: "Parks"
);
db.places.insert( {
name: "Polo Grounds",
location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] },
category: "Stadiums"}
);
以下操作在location字段上创建2dsphere索引:
db.places.createIndex( { location: "2dsphere" } )
以下查询使用$near运算符返回距指定GeoJSON点至少1000米,最多5000米的文档,并按从最近到最远的顺序排序:
db.places.find(
{
location:
{ $near:
{
$geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
$minDistance: 1000,
$maxDistance: 5000
}
}
}
)
以下操作使用geoNear聚合操作返回与查询过滤器{category:“ Parks”}匹配的文档,这些文档按从最接近指定GeoJSON点的最近到最远的顺序排序:
db.places.aggregate( [
{
$geoNear: {
near: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
spherical: **true**,
query: { category: "Parks" },
distanceField: "calcDistance"
}
}
])
译者:杨帅
校对:杨帅
Copyright © 上海锦木信息技术有限公司 all right reserved,由 MongoDB汉化小组 提供技术支持文件修订时间: 2020-10-11 20:53:05