MongoDB中判断点是否在多边形内的技术求助
问题:MongoDB查询包含指定点的多边形文档
我按照MongoDB地理空间查询规范,以经纬度(LNG & lat)格式存储多边形数据,希望查询所有包含指定点(例如:经度-118.421871,纬度33.943645)的文档,且已为zones.area.geo字段创建索引。尝试相关方案后未查询到数据,恳请指导。
文档示例
{ "zoneType": "GEO_FENCE", "zones": [ { "id": "5b9ddf55-d45e-4358-8f37-8fddb7d424e8", "name": "Los Angeles, CA 90045, United States", "area": { "geo": { "coordinates": [ [ [-118.427456, 33.945997], [-118.418435, 33.946995], [-118.417232, 33.938442], [-118.426425, 33.945997], [-118.427456, 33.945997] ] ], "type": "Polygon" } } } ] }
我使用的聚合查询语句
[ { '$match': { '$and': [ { 'companyId': { '$in': [ new ObjectId('63368dbb50f6df4a67f08695'), '63368dbb50f6df4a67f08695' ] } }, { '$or': [ { 'zones.area.geo': { '$geoIntersects': { '$geometry': { 'type': 'Point', 'coordinates': [ -118.426253, 33.945641 ] } } } } ] } ] } } ]
解决方案指导
1. 先验证点与多边形的归属关系
你示例中的多边形经度范围在 -118.427456 ~ -118.417232,纬度范围在 33.938442 ~ 33.946995,测试点[-118.426253, 33.945641]确实在范围内,且多边形首尾坐标闭合,这部分格式没问题。
2. 简化查询语句的冗余逻辑
你的查询中$and和$or都是多余的,且$in内重复了同一个ObjectId,简化后更清晰:
{ '$match': { 'companyId': new ObjectId('63368dbb50f6df4a67f08695'), 'zones.area.geo': { '$geoIntersects': { '$geometry': { 'type': 'Point', 'coordinates': [-118.426253, 33.945641] } } } } }
3. 确认地理空间索引类型
必须确保创建的是2dsphere索引(而非2d索引),2dsphere才支持多边形与点的相交查询:
// 创建索引 db.collection.createIndex({"zones.area.geo": "2dsphere"}) // 查看已创建的索引 db.collection.getIndexes()
4. 处理数组嵌套的精准匹配
如果需要返回具体包含目标点的zone(而非整个文档的所有zones),可以在聚合中添加$unwind和二次过滤:
[ { '$match': { 'companyId': new ObjectId('63368dbb50f6df4a67f08695'), 'zones.area.geo': { '$geoIntersects': { '$geometry': { 'type': 'Point', 'coordinates': [-118.426253, 33.945641] } } } } }, { '$unwind': '$zones' }, { '$match': { 'zones.area.geo': { '$geoIntersects': { '$geometry': { 'type': 'Point', 'coordinates': [-118.426253, 33.945641] } } } } } ]
5. 再次确认坐标顺序
MongoDB严格遵循**[经度, 纬度]**的顺序,你的存储和查询都符合规范,这部分无需调整,但可再次核对目标点的坐标顺序是否正确。
内容的提问来源于stack exchange,提问作者Arrow
相关产品推荐
相关产品推荐

