MongoDB $geoWithin查询异常:点在多边形内却无法被检索
MongoDB $geoWithin 查询异常:包含点的多边形无法匹配文档
我尝试用两个相似的多边形查询某一文档,两个多边形均包含该文档的位置,但其中一个能查询到文档,另一个却无法查询到。原本以为这与「大多边形」相关,但已将多边形缩小足够程度以排除该可能性。请问有什么原因可以解释这种差异?
目标文档内容
{ "_id": { "$oid": "63ef9379e671073bfb963145" }, "geometry": { "type": "Point", "coordinates": [ 2.834, 47.264 ] }, "_class": "org.example.springdatamongodbgeowithinissue.model.SamplingGeometry" }
无结果的查询语句
{ "geometry": { "$geoWithin": { "$geometry": { "type": "Polygon", "coordinates": [ [ [-16.1, 49.12], [-16.1, 46.156], [16.1, 46.156], [16.1, 49.12], [-16.1, 49.12] ] ] } } } }
原因分析与解决方法
问题核心在于MongoDB对多边形顶点顺序的要求:
- 默认的球面地理空间查询中,多边形顶点必须遵循逆时针顺序(右手定则)。如果顶点是顺时针排列,MongoDB会将多边形的"内部"识别为整个球面除多边形之外的区域,导致实际查询的是点所在范围之外的空间,自然无匹配结果。
- 你提供的多边形顶点是顺时针顺序,这就是查询失败的根本原因。
解决方法很简单:将多边形顶点调整为逆时针顺序,修改后的查询语句如下:
{ "geometry": { "$geoWithin": { "$geometry": { "type": "Polygon", "coordinates": [ [ [-16.1, 49.12], [16.1, 49.12], [16.1, 46.156], [-16.1, 46.156], [-16.1, 49.12] ] ] } } } }
调整后,MongoDB会正确识别多边形的内部区域,就能匹配到目标文档了。
内容的提问来源于stack exchange,提问作者charlycou
相关产品推荐
相关产品推荐

