$geoWithin
定义
$geoWithin
选择地理空间数据完全位于指定形状内的文档。
指定的结构可以是 GeoJSON
Polygon
(单环或多环)、GeoJSONMultiPolygon
或由旧版坐标对定义的结构。$geoWithin
操作符使用$geometry
操作符指定 GeoJSON 对象。要使用默认坐标参考系 (CRS) 指定 GeoJSON 多边形或多多边形,请使用以下语法:
{ <location field>: { $geoWithin: { $geometry: { type: <"Polygon" or "MultiPolygon"> , coordinates: [ <coordinates> ] } } } } 对于指定面积大于单个半球的 GeoJSON 几何图形的
$geoWithin
查询,使用默认 CRS 会生成对互补几何图形的查询。要使用自定义 MongoDB CRS 指定单环 GeoJSON 多边形,请在
$geometry
表达式中使用指定自定义 MongoDB CRS 的原型:{ <location field>: { $geoWithin: { $geometry: { type: "Polygon" , coordinates: [ <coordinates> ], crs: { type: "name", properties: { name: "urn:x-mongodb:crs:strictwinding:EPSG:4326" } } } } } } 自定义 MongoDB CRS 使用逆时针绕组顺序,并允许
$geoWithin
支持使用单环 GeoJSON 多边形(其面积大于或等于单个半球)的查询。如果指定的多边形小于单个半球,则使用 MongoDB CRS 的$geoWithin
的行为与使用默认 CRS 的行为相同。另请参阅“大型”多边形。如果查询是否包含在由平面上的传统坐标对定义的形状中,请使用以下事务语法:
{ <location field>: { $geoWithin: { <shape operator>: <coordinates> } } } 可用形状操作符包括:
$center
(定义一个圆),且$centerSphere
(在球体上定义一个圆)。
重要
如果使用经度和纬度,请按照
longitude, latitude
的顺序指定坐标。
行为
地理空间索引
$geoWithin
不需要地理空间索引。但是,地理空间索引可提高查询性能。2dsphere 和 2d 地理空间索引都支持 $geoWithin
。
未排序的结果
$geoWithin
操作符不返回排序结果。因此,MongoDB 的 $geoWithin
查询比要对结果进行排序的地理空间 $near
或 $nearSphere
查询能够更快地返回结果。
退化几何图形
$geoWithin
不保证它会考虑一个几何体来纳入其组件几何体,或另一个共享其组件几何体的多边形。
“大”多边形
对于$geoWithin
,如果指定面积大于单个半球的单环多边形,请包含the
custom MongoDB coordinate reference system in the $geometry
表达式;否则, $geoWithin
将查询互补几何体。 对于面积大于半球的所有其他 GeoJSON 多边形, $geoWithin
会查询互补几何体。
示例
在多边形内
以下示例选择了完全存在于 GeoJSON Polygon
中的所有 loc
数据。 多边形的面积小于单半球的面积:
db.places.find( { loc: { $geoWithin: { $geometry: { type : "Polygon" , coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] } } } } )
对于面积大于单半球的单环多边形,请参阅在“大型”多边形内。
在“大型”多边形内
如需使用面积大于单个半球的单环 GeoJSON 多边形进行查询,$geometry
表达式必须指定自定义 MongoDB 坐标参考系。例如:
db.places.find( { loc: { $geoWithin: { $geometry: { type : "Polygon" , coordinates: [ [ [ -100, 60 ], [ -100, 0 ], [ -100, -60 ], [ 100, -60 ], [ 100, 60 ], [ -100, 60 ] ] ], crs: { type: "name", properties: { name: "urn:x-mongodb:crs:strictwinding:EPSG:4326" } } } } } } )