MongoDB 导出数据有两个官方工具,用途各不同:
mongodump— 二进制 BSON,用于完整备份和恢复(配合mongorestore)mongoexport— JSON / CSV 明文,用于数据处理和迁移到其它系统
搞混了会踩坑:拿 BSON 想给别的系统吃是不行的,拿 JSON 恢复也丢索引和元数据。
mongodump:完整备份
mongodump \
--host localhost \
--port 27017 \
--db test \
--out ./backup
产物:
backup/
└── test/
├── users.bson # 数据(BSON 格式)
├── users.metadata.json # 索引、options 等元信息
└── orders.bson
恢复:
mongorestore ./backup
# 或指定库
mongorestore --nsInclude "test.*" ./backup
gzip 压缩:
mongodump --db test --archive=backup.gz --gzip
mongorestore --archive=backup.gz --gzip
生产备份用这个——单文件、自带索引元数据、恢复一步到位。
mongoexport:导出 JSON / CSV
mongoexport \
--db test \
--collection users \
--out users.json
默认是 NDJSON(每行一个 JSON 对象):
{"_id":{"$oid":"..."},"name":"Tom","age":18}
{"_id":{"$oid":"..."},"name":"Jerry","age":22}
想要标准 JSON 数组:
mongoexport --db test --collection users --jsonArray --out users.json
导出 CSV:
mongoexport \
--db test \
--collection users \
--type=csv \
--fields=name,age,email \
--out users.csv
CSV 必须显式列出 --fields,不给字段名会报错。
条件导出
--query 是 MongoDB shell 的 JSON 语法:
mongoexport \
--db test \
--collection users \
--query '{"age":{"$gt":18},"status":"active"}' \
--out active_users.json
日期区间过滤:
--query '{"createdAt":{"$gte":{"$date":"2026-01-01T00:00:00Z"}}}'
带账号密码
推荐用 URI 一把传:
mongoexport \
--uri="mongodb://admin:PASSWORD@127.0.0.1:27017/test?authSource=admin" \
--collection users \
--jsonArray \
--out users.json
或者分开:
mongodump \
--host localhost --port 27017 \
--username admin --password PASSWORD \
--authenticationDatabase admin \
--db test --out backup
authSource=admin 很重要——默认认证库是当前 db,绝大多数生产环境把用户建在 admin 库。
Docker 里的 MongoDB
进容器里跑:
docker exec -it mongo mongodump --db test --out /tmp/backup
docker cp mongo:/tmp/backup ./backup
或者从宿主机直连(容器映射了端口):
mongodump --host 127.0.0.1 --port 27017 --db test --out ./backup
Python 版本
from pymongo import MongoClient
import json
client = MongoClient("mongodb://localhost:27017")
col = client["test"]["users"]
# 不要 _id 字段,方便导入到其它系统
data = list(col.find({}, {"_id": 0}))
with open("users.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
按条件流式导出(大数据集省内存):
import json
with open("users.ndjson", "w", encoding="utf-8") as f:
for doc in col.find({"age": {"$gt": 18}}, {"_id": 0}):
f.write(json.dumps(doc, ensure_ascii=False) + "\n")
一张对比表
| 需求 | 用什么 |
|---|---|
| 备份 + 恢复到 MongoDB | mongodump |
| 迁移到 MongoDB(跨版本、跨集群) | mongodump + mongorestore |
| 导出给下游数据管道用 | mongoexport --jsonArray |
| 导出给 Excel / BI | mongoexport --type=csv |
| 定制字段结构、脱敏 | Python + pymongo |
| 增量导出 | --query + 时间戳过滤 |
一句话总结
备份恢复用 mongodump,跨系统迁移用 mongoexport。Docker 容器里跑要注意 exec 进去或映射端口。生产环境永远用 URI + authSource=admin。
