如何为包含嵌套坐标数组的MongoDB文档创建2dsphere索引
错误原因
你创建2dsphere索引时指定的字段是geometry.coordinates,不符合MongoDB针对GeoJSON格式数据的索引规则:
2dsphere索引如果直接作用于坐标数组,仅支持单个点位的一维数值数组(存储经度、纬度两个/加高程三个数值),而LineString的coordinates是存储多组坐标对的嵌套数组,MongoDB会误将嵌套层级的坐标对尝试按单个点校验,才会抛出「点只能包含数值元素」的错误。
解决方案
无需修改原有数据,直接对完整的GeoJSON对象字段geometry创建2dsphere索引即可,MongoDB会自动读取geometry.type判断地理类型,按对应规则解析coordinates字段:
db.infrastructure.createIndex({ "geometry": "2dsphere" })
异常排查(可选)
如果执行上述命令仍报错,可运行以下查询检查是否存在不符合GeoJSON规范的脏数据:
// 查找coordinates包含非数值、或geometry.type不符合预期的文档 db.infrastructure.find({ $or: [ { "geometry.type": { $nin: ["LineString", "Point", "Polygon"] } }, { "geometry.coordinates": { $elemMatch: { $elemMatch: { $not: { $type: "number" } } } } } ] })
内容的提问来源于stack exchange,提问作者bkleeman
相关产品推荐
相关产品推荐

