mongofiles是MongoDB官方提供的GridFS命令行工具,用于上传、下载、列出和删除文件,但不支持目录递归上传、元数据自定义或并发操作,批量处理需配合shell脚本,且必须显式指定数据库、存储桶和认证参数才能正确交互。

mongofiles 是 MongoDB 官方提供的命令行工具,专用于与 GridFS 交互。它不依赖驱动、不写代码,适合快速调试或运维场景。但它的行为和参数容易被误解,尤其在指定数据库、存储桶、文件名时。
下载前必须确认 files 集合里有对应文件
执行 mongofiles list 只显示 fs.files 中的记录(默认存储桶),不会扫描自定义桶或其它数据库。常见错误是:文件实际存于 mybucket.files,但运行 mongofiles -d mydb list 却看不到——因为没加 --bucket mybucket 参数。
-
mongofiles -d mydb --bucket mybucket list才能查指定桶 - 文件名区分大小写,且包含路径时(如
uploads/report.pdf),list输出中会原样显示,下载时必须完全匹配 - 若
list为空,先检查db.mybucket.files.find().count()是否真有数据,排除写入失败或集合名拼错
mongofiles get 的路径与重命名逻辑
mongofiles get 默认把文件下载到当前工作目录,且**不保留原始路径结构**。比如 GridFS 中存的是 images/avatar@2x.png,执行 mongofiles get "images/avatar@2x.png" 后,生成的文件就是当前目录下的 avatar@2x.png,前面的 images/ 被丢弃了。
- 要控制本地保存路径,只能靠 shell 重定向或后续
mv,mongofiles本身无--output或-o参数 - 如果想另存为不同名字,用
mongofiles get "remote-name.jpg" > local-name.jpg(注意:仅适用于无二进制乱码的文本类文件;图片/视频等必须用--local) - 真正可靠的重命名方式是加
--local参数:mongofiles --local ./out/photo.jpg get "original.jpg"
连接参数和权限问题常导致 No files found
这个错误信息极具误导性——它不一定代表文件不存在,更可能是认证失败、数据库选错,或用户没有 read 权限访问 fs.files 集合。
- 必须显式指定数据库:
mongofiles -d myapp_db get "doc.pdf",否则默认连test库 - 带认证时,
--username和--password必须成对出现,且--authenticationDatabase通常不是目标库(比如用户建在admin,就得加--authenticationDatabase admin) - 最小必要权限:角色
read或readWrite对目标数据库,不能只给clusterAdmin这类集群级权限 - URI 形式连接(
--host mongodb://...)不被mongofiles支持,只能用--host+--port+--username等拆开传
替代方案:什么时候不该用 mongofiles
它适合一次性拉取单个文件或简单脚本调用,但遇到以下情况应直接切到驱动程序:
- 需要流式下载(避免内存爆掉)——
mongofiles总是先把整个文件载入内存再写盘 - 要读取
metadata字段(比如uploadedBy、version)——mongofiles不提供元数据导出接口 - 文件名含 Unicode 或特殊字符(如 emoji、中文路径),
mongofiles在某些 shell 下会解码失败 - 需并发下载多个文件——它不支持批量操作,循环调用效率低且难做错误隔离
mongo shell 直连,查 db.fs.files.findOne() 确认文档存在,再比对 mongofiles 命令里的每个参数是否严格一致。

















