使用地理空间搜索

在与 MongoDB 兼容的操作中使用地理空间查询,以查询位于特定经度和纬度一定范围内的文档。

准备工作

  1. 确保您有权访问现有的 MongoDB 兼容操作数据库,或者创建数据库并连接到该数据库

  2. 确保您至少有一个 2dsphere 索引,或者创建 2dsphere 索引

GeoJSON 对象

如需针对集合中的字段运行地理空间查询,您查询的字段必须是 GeoJSON 对象GeoPoint

您可以使用 $near 运算符执行地理空间查询,该运算符可计算地理坐标点相对于文档中地理坐标点的距离。然后,系统会按距离从近到远对查询结果中的这些文档进行排序。您还可以在查询中定义除 $natural 之外的辅助排序,以替换此排序顺序。$near 运算符必须存在于查询过滤条件中的文档字段中,并且必须包含 $geometry GeoJSON 字段。

在以下示例中,$near 运算符用于计算地理坐标点 (-122.084, 37.4221)myCollection. 中所有文档的 location 字段中包含的地理坐标点之间的距离。系统会返回这些文档,并按两个点之间距离由近到远进行排序。

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        }
      }
    }
  }
  )

您还可以使用可选的 $maxDistance$minDistance 字段来控制查询点周围的距离(以米为单位)。以下示例展示了一个查询,其中返回的文档必须距离点 (-122.084, 37.4221) 至少 500 米,最多 2000 米:

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
        $maxDistance: 2000,
        $minDistance: 500
      }
    }
  }

如果您的索引已分区,则可以在查询中添加“and”等值过滤条件,以根据分区进行过滤。例如,如果您有一个 region 分区,并希望按 midwest 区域过滤查询结果,可以执行以下操作:

  db.myCollection.find( { $and: [
    { location:
      { $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
      }
    },
    { "region": "midwest" }
  ] } )

分区的值必须是字符串。您的分区过滤条件必须通过 $and 运算符与搜索查询联接。

限制

  • $near 运算符和 $text 运算符不能在同一查询中使用。
  • $near 不能嵌套在多子句 $or 语句中,除非 $near$or 子句中的唯一表达式。
  • $near 不能与查询中的 $not$nor 运算符搭配使用。
  • 聚合查询不支持 $near