mongoexport 和 mongoimport 不能直接跨库迁移数据,需文件中转且不保留 ObjectId、索引等元信息;导出须用 --jsonFormat=canonical 和显式字段声明,导入前需手动建库建集并校验类型。

mongoexport 和 mongoimport 不能直接跨库迁移数据——它们只支持「导出为文件 → 导入到目标库」的两步中转,且默认不保留 ObjectId、索引、TTL、引用关系等元信息。真要迁移,必须手动补全这些细节。
mongoexport 导出时字段名与类型容易丢失
导出 JSON 或 CSV 时,mongoexport 默认使用「宽松 JSON 模式」(--jsonFormat=relaxed),会把 ObjectId("...")、Date、ISODate(...) 全部转成字符串,导入后变成普通字符串字段,不再是原生类型。
- 导出带类型语义的严格 JSON:加
--jsonFormat=canonical,确保ObjectId写成{"$oid": "..."},日期写成{"$date": "..."} - 必须指定
--fields或用--fieldsFile显式声明字段,否则嵌套字段(如user.profile.name)可能被扁平化或丢弃 - 避免用
--type=csv迁移含数组或对象的文档——CSV 不支持嵌套结构,会强制转空字符串或报错
mongoimport 导入时数据库和集合需提前创建
mongoimport 不会自动创建目标数据库或集合,也不会复用源库的索引、分片键、读写关注配置。它只负责把文件内容插入到指定 --db 和 --collection 中。
- 先连目标 MongoDB 执行:
use target_db→db.createCollection("target_coll")(尤其当启用了collation或validation时) - 导入时必须显式指定
--db=target_db --collection=target_coll;不加--db会默认进test库 - 若源文档含
_id字段且值为{"$oid": "..."},需加--maintainInsertionOrder --stopOnError防止重复_id导致部分失败
ObjectId 和时间字段在 round-trip 中易失效
即使用了 --jsonFormat=canonical,从导出到导入仍存在隐式转换风险:比如 mongoimport 在非严格模式下可能忽略 $oid 结构,直接存成子文档。
- 验证导出文件是否含正确格式:用
head -n 5 export.json | jq '.'看是否有{"$oid": "..."}而非"_id": "507f1f77bcf86cd799439011" - 导入时强制启用解析:
mongoimport --jsonFormat=canonical ...(注意:该参数在 6.0+ 才默认生效,旧版本需额外加--legacy或升级工具) - 对关键字段(如
_id,createdAt)导入后务必抽样校验类型:db.target_coll.findOne().createdAt instanceof Date应返回true
跨库迁移真正麻烦的不是导出导入本身,而是 ObjectId 是否被当字符串存进去、索引有没有重建、应用连接串是否切到新库——这些都不会被 mongoexport/mongoimport 自动处理。别跳过手动验证这一步。


















