使用地理空间查询

在与 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 米且最多 2,000 米:

  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。