Navicat 16“导出为 JSON”实为调用mongodump生成BSON二进制文件,并非标准JSON;需配置外部mongoexport工具并勾选“Export as JSON”,配合正确参数(如--jsonArray)才能生成mongoimport可直接消费的可读JSON文件。
navicat 16 自带的 mongodb 导出向导不支持直接生成标准 json 文件(即每行一个文档或数组格式),它默认导出的是 bson 或二进制格式;真要得到可读、可编辑、可被 mongoimport 直接消费的 json,必须绕过向导,用命令行工具 + 正确参数。
为什么 Navicat 的“导出为 JSON”选项导出的是乱码或无法解析的文件
Navicat 16 对 MongoDB 的导出功能底层调用的是 mongodump,而非 mongoexport。即使界面上写了“JSON”,实际输出的是 BSON 归档(.bson)+ 元数据文件(.metadata.json),不是纯文本 JSON。这类文件不能用文本编辑器打开,也不能被 mongoimport --type json 读取。
- 你看到的“导出为 JSON”只是 UI 标签误导,本质仍是 dump 流程
- 导出路径下会生成两个文件:
collection.bson和collection.metadata.json,后者是结构描述,前者是二进制 - 试图用
cat collection.bson查看会显示乱码;用mongoimport --file collection.bson会报错invalid JSON
真正能导出可用 JSON 的做法:用 mongoexport 命令行 + Navicat 配置路径
Navicat 16 允许你指定外部工具路径,其中就包括 mongoexport。只要提前下载 MongoDB Database Tools 并配置好,就能在右键菜单里触发标准 JSON 导出。
- 去 MongoDB 官网下载 Database Tools(选对应系统版本,如 Windows x64)
- 解压后找到
mongoexport.exe(Windows)或mongoexport(macOS/Linux),记下完整路径,例如:C:\mongodb-database-tools\bin\mongoexport.exe - 在 Navicat 中:右键集合 → MongoExport → 点击设置图标 → 填入上面的
mongoexport.exe路径 - 再次右键 → MongoExport → 在弹窗中勾选 “Export as JSON”**(注意不是“BSON”),并确认
-o输出路径是.json后缀
mongoexport 常见失败原因和修复项
即使路径配对了,导出仍可能静默失败或生成空文件,关键在参数是否匹配数据形态:
- 如果源集合文档是单个对象(非数组),导出默认就是一行一文档格式,
mongoimport --file xxx.json可直接导入 - 如果导出时用了
--jsonArray参数(比如你手动改过命令),那文件内容会是[{...},{...}]形式 —— 此时mongoimport必须加同样参数,否则报0 documents imported - 导出 CSV 时必须带
-f指定字段,否则报错csv mode requires a field list;JSON 模式下该参数可省略 - 含特殊字符(如中文、斜杠、控制符)的字段值,在 JSON 中会被自动转义,不影响导入;但若原始数据里有非法 UTF-8 字节,
mongoexport会跳过该文档并打印 warning,不会中断整个流程
导出 JSON 后验证是否可用的最快方式
别急着导入,先用两行命令确认文件结构和兼容性:
- 查看前几行:
head -n 3 your-collection.json(Linux/macOS)或Get-Content your-collection.json -Head 3(PowerShell)—— 应看到类似{ "_id": { "$oid": "..." }, "name": "xxx" } - 快速校验 JSON 格式:
python -m json.tool your-collection.json | head -n 5,无报错即语法合法 - 模拟一次导入(不写库):
mongoimport --dryRun --file your-collection.json --quiet,输出read 123 objects即说明可被识别
真正容易被忽略的是:Navicat 的“导出向导”和“MongoExport”是两套机制,前者不可信,后者才可控;而 --jsonArray 这个开关一旦启用,就必须在导入时显式声明,否则数据就“消失”在 silent fail 里。











