地理空间搜索
概述
您可以使用地理空间查询运算符根据地理位置查询数据。您可以使用以下坐标系之一格式化地理空间查询
本节包含使用不同查询运算符的地理空间查询示例,这些查询可以在您的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"});
二维平面上的坐标
您也可以使用二维欧几里得平面上的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 米内的电影院。
// Find theaters within a certain proximity async function proximity(theaters) { // Define the query to find theaters near a specific location 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 操作符选择存在于指定形状内的地理空间数据的文档。以下示例搜索新英格兰地区的电影院。
// Find theaters within a specific geographic range async function range(theaters) { // Define the query to find theaters within a specified polygon const query = { "location.geo": { $geoWithin: { $geometry: { type: "Polygon", coordinates: [ [ [-72, 40], // Polygon coordinates defining the range [-74, 41], [-72, 39], [-72, 40], ], ], }, }, }, }; // Find documents based on our query const cursor = theaters.find(query);
有关您可以在查询中使用的操作符的更多信息,请参阅 MongoDB 服务器手册中的地理空间查询操作符页面。