mongoexport 的 -q 参数必须使用标准 JSON 格式:键和字符串值需双引号,禁用单引号、函数及 ISODate;日期用 ISO 字符串,正则需转义反斜杠;大数据集须加 --limit 或分批导出;CSV 导出需显式指定 --type csv;连接远程库时务必设置 --authenticationDatabase。

mongoexport 的 -q 参数必须是 JSON 格式,不是 JavaScript 表达式
很多人直接把 db.collection.find({name: "Alice"}) 里的查询对象复制过去,结果报错 Failed: error parsing query as JSON。因为 mongoexport 的 -q 只接受标准 JSON(双引号、无函数、无单引号),不支持 MongoDB Shell 里的写法。
实操建议:
- 用双引号包裹所有 key 和 string 值:
{"name": "Alice", "age": {"$gt": 25}} - 日期不能写
ISODate("..."),得用字符串格式:{"created_at": {"$gte": "2024-01-01T00:00:00Z"}} - 正则要写成
{"email": {"$regex": "^user.*@example\.com$", "$options": "i"}},注意反斜杠需转义 - 如果查询含特殊字符或嵌套深,先在
mongosh里用JSON.stringify(query, null, 2)格式化再复制
导出大结果集时务必加 --limit 或 --skip + --limit 避免内存/超时
mongoexport 是客户端工具,会把整个查询结果拉到本地再写文件。没加限制时,一个百万级结果集可能吃光内存或触发连接超时(尤其通过远程 MongoDB Atlas 连接)。
实操建议:
- 先导出小样本验证语句:
mongoexport -d mydb -c users -q '{"status":"active"}' --limit 100 -o sample.json - 分批导出用
--skip+--limit,比如每批 5 万:mongoexport -d mydb -c logs -q '{"ts": {"$gte": "2024-06-01"}}' --skip 0 --limit 50000 -o logs_001.json - 避免用
--skip跳过几十万条——性能差,改用范围查询(如按_id或时间字段分段)
字段筛选和类型处理:--fields 和 --type 决定输出可读性
默认导出全部字段且为 JSON,但实际常需要 CSV(方便 Excel 打开)或只取部分字段。字段名写错、类型不匹配会导致空值或报错。
实操建议:
- 导出 CSV 必须显式指定
--type csv,否则即使加了--fields仍输出 JSON -
--fields的值是逗号分隔的字段名列表,不含空格:--fields name,email,profile.score - 嵌套字段(如
address.city)在 CSV 中会被展平,但 JSON 模式下保持原结构 - ObjectId、Date 等类型在 CSV 中自动转为字符串;若需 ISO 格式时间,确保源字段是
ISODate,且 MongoDB 版本 ≥ 4.4(旧版可能输出毫秒数)
连接与认证参数容易漏掉 --authenticationDatabase
本地单机 MongoDB 可能不报错,但连 ReplicaSet 或 Atlas 时,如果用户是在 admin 库创建的,却没指定 --authenticationDatabase admin,会提示 Authentication failed,哪怕用户名密码都对。
实操建议:
- 始终显式写全认证参数:
mongoexport -h "cluster123.xzy.mongodb.net:27017" -u myuser -p "mypass" --authenticationDatabase admin -d mydb -c coll -q '{}' -o out.json - 密码含特殊字符(如
@、/)必须 URL 编码,或改用--password交互式输入 - 使用连接字符串时,
--uri优先级最高,此时其他 host/user/pwd 参数会被忽略


















