为何无法向MongoDB数据库插入数据?MongoDB 6.0.1插入报错求助
解决MongoDB插入带$oid的_id报错问题
错误原因
你使用的是MongoDB的扩展JSON格式(带$oid嵌套结构),这种格式是为数据导出/导入工具(如mongodump/mongorestore)或可视化工具(如Compass)设计的识别格式。但直接在Mongo Shell或服务器端执行insert命令时,MongoDB会将$开头的字段视为操作符,不允许作为普通存储字段存在,因此抛出$oid is not valid for storage错误。
解决方案
1. 直接在Shell中修改格式
将$oid结构替换为Mongo Shell支持的ObjectId()构造函数,命令修改为:
db.tag.insertMany([{"_class": "test.Tag", "title": "New Title","_id": ObjectId("637a4171833047f9e046f3c9")}])
ObjectId()会将传入的字符串转换为MongoDB原生的ObjectId类型,作为文档的_id存储,避免了$前缀字段的问题。
2. 批量导入用官方工具
如果是批量导入导出的JSON数据,不要手动在Shell执行插入,使用MongoDB官方的mongoimport工具,它能自动解析扩展JSON中的特殊字段(如$oid、$date):
mongoimport --uri "mongodb://你的服务器地址" --collection tag --file 你的导出文件.json --jsonArray
这个工具会自动将$oid转换为ObjectId类型,无需手动修改JSON内容。
为什么Compass可以正常操作?
Compass内部做了格式转换:当你输入带$oid的JSON时,它会自动将其解析为MongoDB原生的ObjectId类型,再发送给数据库,因此不会触发报错。但Shell和驱动没有这个自动转换逻辑,必须手动调整格式。
内容的提问来源于stack exchange,提问作者user13578
相关产品推荐
相关产品推荐

