在与 MongoDB 兼容的操作中使用地理空间查询,以查询位于特定经度和纬度一定范围内的文档。
准备工作
确保您有权访问现有的 MongoDB 兼容操作数据库,或者创建数据库并连接到该数据库。
确保您至少有一个 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。