文档菜单
文档首页
/ / /
Node.js 驱动程序
/ / /

地理空间搜索

在本页

  • 概述
  • 类似于地球的球体上的坐标
  • 二维平面上的坐标
  • 示例
  • 基于邻近度查询
  • 范围查询

您可以使用地理空间查询运算符根据地理位置查询数据。您可以使用以下坐标系之一格式化地理空间查询

  • 类似于地球的球体上的坐标

  • 二维平面上的坐标

本节包含使用不同查询运算符的地理空间查询示例,这些查询可以在您的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"});

您也可以使用二维欧几里得平面上的xy坐标来表示地理空间查询。在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 服务器手册中的地理空间查询操作符页面

返回

指定要返回的字段