地理空间查询
在本页面:
要指定GeoJSON数据,请使用嵌入的文档:
- 一个名为type的字段,用于指定GeoJSON对象类型
- 一个名为坐标的字段,用于指定对象的坐标。
如果指定纬度和经度坐标,请先列出经度,然后再列出纬度:
- 有效的经度值在**-180到180**之间(包括两者)。
- 有效的纬度值在**-90到90**之间(包括两者之间)。
<field>: { type: <GeoJSON type> , coordinates: <coordinates> }
location: {
type: "Point",
coordinates: [-73.856077, 40.848447]
}
要将数据指定为旧版坐标对,可以使用数组(首选)或嵌入式文档。
<field>: [ <x>, <y> ]
如果指定纬度和经度坐标,请先列出经度,然 后再列出纬度; 即:
<field>: [<longitude>, <latitude> ]
- 有效的经度值在**[-180 180]**。
- 有效的纬度值在**[-90 90]**。
<field>: { <field1>: <x>, <field2>: <y> }
如果指定纬度和经度坐标,第一个字段必须包含经度值,而第二个字段必须包含纬度值;即。
<field>: { <field1>: <longitude>, <field2>: <latitude> }
- 有效的经度值在**[-180 180]**。
- 有效的纬度值在**[-90 90]**。
为了指定旧版坐标对,数组比嵌入式文档更可取,因为某些语言不能保证关联地图的排序。
MongoDB提供以下地理空间索引类型以支持地理空间查询。
2dsphere
索引支持查询,该查询可在类似地球的球体上计算几何形状。
db.collection.createIndex( { <location field> : "2dsphere" } )
其中**<
location field
>**是其值为GeoJSON对象或旧版坐标对的字段。2d
db.collection.createIndex( { <location field> : "2d" } )
地理空间索引和分片集合
分片集合时,不能将地理空间索引用作分片键。但是,可以通过使用不同的字段作为分片键在分片集合上创建地理空间索引。
分片集合支持以下地理空间操作:
在早期的MongoDB版本中,分片集合不支持
$near
和 $nearSphere
查询。相反,对于分片群集,必须使用$geoNear
聚合阶段或geoNear命令(在MongoDB 4.0及更低版本中可用)。涵盖查询
[success] Note对于球形查询,请使用2dsphere索引结果。将2d索引用于球形查询可能会导致错误的结果,例如将2d索引用于环绕两极的球形查询。
MongoDB提供以下地理空间查询操作符:
名字 | 说明 |
---|---|
有关更多细节(包括示例),请参见个别参考页面。
MongoDB提供以下地理空间聚合管道阶段:
MongoDB地理空间查询可以解释平面或球体上的几何。
2dsphere索引仅支持球形查询(即解释球形表面几何形状的查询)。
2d索引支持平面查询(即解释平面上的几何图形的查询)和某些球形查询。 虽然2d索引支持某些球形查询,但是将2d索引用于这些球形查询可能会导致错误。 如果可能,请对球形查询使用2dsphere索引。
下表列出了每个地理空间操作所使用的地理空间查询运算符,受支持的查询:
操作方式 | 球面/平面查询 | 笔记 |
---|---|---|
球形 | ||
平面 | | |
球形 | 提供与使用GeoJSON点和2dsphere索引的$ near操作相同的功能。对于球形查询,最好使用$ nearSphere而不是$ near运算符,后者在名称中显式指定球形查询。 | |
球形 | ||
球形 | | |
平面 | | |
平面 | | |
平面 | | |
球形 | | |
球形 | | |
球形 | | |
平面 | |
用以下文档创建一个集合places:
db.places.insert( {
name: "Central Park",
location: { type: "Point", coordinates: [ -73.97, 40.77 ] },
category: "Parks"
} );
db.places.insert( {
name: "Sara D. Roosevelt Park",
location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] },
category: "Parks"
);
db.places.insert( {
name: "Polo Grounds",
location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] },
category: "Stadiums"}
);
以下操作在location字段上创建2dsphere索引:
db.places.createIndex( { location: "2dsphere" } )
db.places.find(
{
location:
{ $near:
{
$geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
$minDistance: 1000,
$maxDistance: 5000
}
}
}
)
以下操作使用geoNear聚合操作返回与查询过滤器**{category:“ Parks”}**匹配的文档,这些文档按从最接近指定GeoJSON点的最近到最远的顺序排序:
db.places.aggregate( [
{
$geoNear: {
near: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
spherical: **true**,
query: { category: "Parks" },
distanceField: "calcDistance"
}
}
])
译者:杨帅
校对:杨帅
最近更新 1yr ago