MongoDB 导出数据:mongodump 和 mongoexport 怎么选

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")

一张对比表

需求用什么
备份 + 恢复到 MongoDBmongodump
迁移到 MongoDB(跨版本、跨集群)mongodump + mongorestore
导出给下游数据管道用mongoexport --jsonArray
导出给 Excel / BImongoexport --type=csv
定制字段结构、脱敏Python + pymongo
增量导出--query + 时间戳过滤

一句话总结

备份恢复用 mongodump,跨系统迁移用 mongoexport。Docker 容器里跑要注意 exec 进去或映射端口。生产环境永远用 URI + authSource=admin