MongoDB地理查询动态坐标报错:Point must be an array or object 解决
MongoDB聚合管道$geoIntersects报错"Point must be an array or object"的解决方法
问题场景
执行包含$match与$lookup的MongoDB聚合管道时,触发错误提示:"Point must be an array or object"。问题出在$lookup的子管道中使用$geoIntersects,动态引用$mapboxAddress.geometry.coordinates作为Point坐标;但使用静态坐标时查询可正常运行,尝试$toDouble转换坐标值无效。
报错的聚合管道
[ { "$match": { "mapboxAddress.complete": "Felix-Wankel-Straße 15, 74172 Neckarsulm, Germany" } }, { "$lookup": { "from": "pg-boundaries-prod", "let": { "coordinates": "$mapboxAddress.geometry.coordinates" }, "pipeline": [ { "$match": { "geometry": { "$geoIntersects": { "$geometry": { "type": "Point", "coordinates": "$$coordinates" } } } } } ], "as": "boundariesData" } } ]
解决方法
改用$geoNear操作符替代$geoIntersects完成关联查询,最终可行的聚合管道如下:
[ { "$geoNear": { "near": { "type": "Point", "coordinates": [9.225169, 49.193546] }, "distanceField": "distance", "maxDistance": 1000 * 1000, "spherical": true } }, { "$match": { "mapboxAddress.complete": "Felix-Wankel-Straße 15, 74172 Neckarsulm, Germany" } }, { "$addFields": { "distanceInKm": { "$divide": ["$distance", 1000] }, "modifiedMapboxAddress": { "$concat": ["$mapboxAddress.complete", ", Germany"] } } }, { "$sort": { "distance": 1 } }, { "$lookup": { "from": "pg-boundaries-prod", "let": { "coordinates": "$mapboxAddress.geometry.coordinates" }, "pipeline": [ { "$geoNear": { "near": { "type": "Point", "coordinates": "$$coordinates" }, "distanceField": "distance", "spherical": true } } ], "as": "boundariesData" } }, { "$project": { "distanceInKm": 1, "boundariesData": { "$arrayElemAt": ["$boundariesData", 0] }, "_id": 1, "mapboxAddress": 1, "corr": "$mapboxAddress.geometry.coordinates", "houseInfo": 1 } }, { "$limit": 1 } ]
内容的提问来源于stack exchange,提问作者rushil patel
相关产品推荐
相关产品推荐

