MongoDB MultiPolygon 的地理空间查询

MongoDB Geospacial Query on MultiPolygon

我一直在通读 mongo 关于地理空间查询的文档,并且对单一多边形类型运行良好,但在使用 MultiPolygon 时遇到了问题。我想做的基本上是这样的:

给定一个 MultiPolygon 轮廓排除区域:

{
    "type" : "MultiPolygon",
    "coordinates" : [ 
        [ 
            [ 
                [ 
                    -117.873730659485, 
                    33.6152089844919
                ], 
                [ 
                    -117.873065471649, 
                    33.615048159758
                ], 
                [ 
                    -117.873044013977, 
                    33.614690770386
                ], 
                [ 
                    -117.873666286469, 
                    33.6146729008785
                ], 
                [ 
                    -117.873730659485, 
                    33.6152089844919
                ]
            ]
        ]
    ]
}

我只是希望能够传入一个Point,看看是否排除。我试过 $geoIntersects 只是想看看它是否甚至可以确定是否包含 Point,但这不起作用。最后,我想检查一个点是否 not 包含在排除列表中,但是没有额外的 $not 运算符查询更简单......这就是我'一直在努力:

var geoPoint = {type: 'Point', coordinates: [-117.8731230, 33.6150696]};
db.myCollection.aggregate([
  {$match: {'exclusionsPolygons': {$geoIntersects: {$geometry: geoPoint}}}}
]);

请注意,如果我对 Polygon 类型的 GeoJSON 做完全相同的事情,那么它工作得很好:

给定这个多边形:

{
    "type" : "Polygon",
    "coordinates" : [ 
        [ 
            [ 
                -117.8711744, 
                33.6129677
            ], 
            [ 
                -117.8751744, 
                33.6129677
            ], 
            [ 
                -117.874444839148, 
                33.6162171973226
            ], 
            [ 
                -117.87287399259, 
                33.6172714730352
            ], 
            [ 
                -117.871410434393, 
                33.6165209730032
            ], 
            [ 
                -117.8711744, 
                33.6129677
            ]
        ]
    ]
}

此查询仅能找到并 returns 其奇异多边形包含点的项目:

var geoPoint = {type: 'Point', coordinates: [-117.8731230, 33.6150696]};
db.myCollection.aggregate([
  {$match: {'singularPolygon': {$geoIntersects: {$geometry: geoPoint}}}}
]);

经过一些修修补补,结果集是对的,我错了...

我正在使用地图上的感兴趣区域来获取地址以尝试查询。一个这样的地方,我想,在一个排除多边形中:

但是,一旦我将多边形变大,结果集就开始像我预期的那样返回...所以,我重置了多边形并仔细检查了地图内容,发现如果我进一步放大该区域由于包含多个感兴趣区域,感兴趣的区域实际上被排除在多边形之外:

糟糕 - 我的错 :)