MongoDB创建2dsphere索引报错:Point需仅含数值元素
解决GeoJSON Point坐标类型错误问题
你遇到的错误是因为MongoDB要求GeoJSON Point的coordinates必须是数值类型,但你的longitude和latitude字段是字符串,直接赋值会导致坐标仍为字符串类型。需要在更新时将这两个字段转换为数值,具体修改addLocation函数如下:
async function addLocation() { const res = await collection.updateMany( { location: { $exists: false } }, // 筛选还没有location字段的文档 [ // 使用聚合管道进行更新,支持使用类型转换操作符 { $set: { location: { type: "Point", coordinates: [ { $toDouble: "$longitude" }, // 将字符串经度转为数值类型 { $toDouble: "$latitude" } // 将字符串纬度转为数值类型 ] } } } ] ); console.log(`更新了${res.modifiedCount}条文档`); }
关键修改说明:
- 将
updateMany的第二个参数改为数组形式的聚合管道,这是MongoDB 4.2+支持的更新方式,允许在更新阶段使用聚合操作符做类型转换 - 用
$toDouble操作符把字符串类型的经纬度字段转换为数值,确保coordinates完全符合GeoJSON Point的格式要求 - 补充
await关键字,等待异步更新操作完成,避免出现未处理的Promise
修改后运行该函数,再执行createIndex创建2dsphere索引就不会再触发类型错误了。
内容的提问来源于stack exchange,提问作者user1592380
相关产品推荐
相关产品推荐

