按地理空间搜索
Overview
您可以使用地理空间查询运算符根据地理位置查询数据。您可以使用以下坐标系之一设置地理空间查询的格式:
本节包含使用不同查询运算符的地理空间查询示例,您可以在 Atlas 示例数据集上运行这些查询。
类似地球球体上的坐标
对于使用类似地球球体经纬度坐标的地理空间查询,请使用 GeoJSON 查询格式。虽然 GeoJSON 有多种类型,但所有 GeoJSON 数据类型都使用以下某种形式的结构:
<field> : { type: <GeoJSON type>, coordinates: [ [longitude_1, latitude_1], ... [longitude_n, latitude_n] ] }
对象类型决定了坐标的数量。 例如, Point
仅需要一个坐标:经度和纬度。 Line
使用两个坐标:每个端点的经度和纬度。 Polygon
由一系列坐标组成,其中第一个坐标和最后一个坐标相同,从而有效闭合多边形。 要了解有关可在 MongoDB 中使用的 GeoJSON 形状的更多信息,请参阅GeoJSON 手册条目。
要启用 GeoJSON 数据查询,您必须将该字段添加到 2dsphere
索引。以下代码段使用 createIndex()
方法在 theaters
集合中的 location.geo
字段上创建索引:
db.theaters.createIndex({location.geo: "2dsphere"});
2D 平面上的坐标
您还可以在二维欧几里得平面中使用 x
和 y
坐标表达地理空间查询。在 MongoDB 之前,这是唯一与地理空间查询兼容的格式,现在称为“传统坐标对”。
传统坐标对使用以下结构:
<field> : [ x, y ]
该字段应包含由两个值组成的数组,第一个值代表 x
轴值,第二个值代表 y
轴值。
若要启用使用旧坐标对的查询,请在集合上的字段上创建 2d
索引。以下代码段使用 createIndex()
方法在 shipwrecks
集合中的 coordinates
字段上创建索引:
db.shipwrecks({coordinates: "2d"});
有关更多信息,请参阅 MongoDB 服务器手册中有关旧版坐标对的页面。
注意
球面 (2dsphere
) 和平面 (2d
) 索引支持一部分(而非全部)相同查询操作符。有关运算符及其索引兼容性的完整列表,请参阅手册中有关地理空间查询的条目。
示例
以下示例使用MongoDB Atlas示例数据集。 您可以在我们的快速指南中学习;了解如何设立自己的免费套餐Atlas 集群以及如何加载示例数据集。
示例使用了样本数据集 sample_mflix
数据库中的 theaters
集合。theaters
集合包含 location.geo
字段上的 2dsphere
索引。
按距离查询
$near 运算符接受一组经纬度坐标,并返回按照从最近到最远的顺序排序的文档。要将结果限制为最大距离(以米为单位),请使用 $maxDistance
选项。有关选项的完整列表,请参阅 $near
的参考文档。以下示例查询坐标为 [ -73.9667, 40.78 ]
,距离 10,000
米范围内的影剧院。
const query = { "location.geo": { $near: { $geometry: { type: "Point", coordinates: [-73.9667, 40.78] }, $maxDistance: 10000, }, }, }; // find documents based on our query const cursor = theaters.find(query);
在范围内查询
$geoWithin 操作符选择指定形状内包含地理空间数据的文档。以下示例搜索新英格兰地区的电影院:
const query = { "location.geo": { $geoWithin: { $geometry: { type: "Polygon", coordinates: [ [ [-72, 40], [-74, 41], [-72, 39], [-72, 40], ], ], }, }, }, }; // find documents based on our query const cursor = theaters.find(query);
有关可在查询中使用的运算符的更多信息,请参阅 MongoDB Server 手册中的地理空间查询操作符页面。