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

按地理空间搜索

在此页面上

  • 概述
  • 类似地球球体上的坐标
  • 2D 平面上的坐标
  • 举例
  • 按距离查询
  • 在范围内查询

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

  • 类似地球球体上的坐标

  • 2D 平面上的坐标

本节包含使用不同查询运算符的地理空间查询示例,您可以在 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 Server 手册页面

注意

球面 (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 Server 手册页面

← 指定要返回的字段