应使用 db.runcommand({"collstats": "fs.chunks"}) 获取 storagesize 并加上 fs.files 的 storagesize,而非 countdocuments();因 chunk 的 bson 开销和压缩导致文档数无法换算真实磁盘占用。

用 db.fs.files.countDocuments() 和 db.fs.chunks.countDocuments() 估算空间不准确
这两个函数只返回文档数量,不是字节大小。GridFS 把一个文件切分成多个 chunk(默认 255KB),每个 chunk 存在 fs.chunks 集合里,还带额外 BSON 开销;fs.files 里存元信息。光数文档数,完全没法换算成磁盘占用。
常见错误现象:有人用 db.fs.files.countDocuments() × 255 * 1024 当总大小,结果比实际高 20%~50%,尤其小文件多时更离谱——因为每个 chunk 至少占几百字节 BSON 头,且最后 chunk 往往远小于 255KB。
- 真正要的是所有
chunk的data字段二进制长度之和,加上fs.files文档的 BSON 序列化体积 -
fs.files体积通常不到总空间的 1%,可暂忽略;重点算fs.chunks.data - MongoDB 服务端不提供聚合后求二进制字段总长的原子操作,必须靠客户端累加或 mapReduce(已废弃)
推荐做法:用 db.runCommand({ "collStats": "fs.chunks" }) 查集合级统计
这是最轻量、最可靠的方式。MongoDB 内部维护了每个集合的磁盘使用摘要,包含压缩后真实占用(storageSize)和原始数据大小(size)。对 GridFS 来说,fs.chunks 占据 99%+ 空间,fs.files 可单独查一次补上。
实操步骤:
- 运行
db.runCommand({ "collStats": "fs.chunks" }),取返回中的storageSize字段值(单位字节) - 再运行
db.runCommand({ "collStats": "fs.files" }),同样取storageSize - 两者相加就是 GridFS 当前实际磁盘占用(含索引、压缩、padding)
注意:storageSize 是 WiredTiger 引擎压缩后的物理磁盘占用,比 size 更贴近你 df 看到的值;如果启用了压缩(默认开启),size 可能大出 2–5 倍。
需要精确到每个文件?得用 mongosh 脚本遍历 fs.files 并 sum length
fs.files 文档里有 length 字段,表示原始文件字节数;这个值是准确的、不含 chunk 开销。如果你只关心“用户上传了多少有效数据”,而不是“磁盘吃了多少”,就该用它。
但要注意:这个值不等于磁盘占用。例如上传一个 1MB 文件,length 是 1048576,但实际磁盘可能占 1.1MB(chunk 对齐 + BSON 开销 + 索引)。
- 执行命令:
db.fs.files.aggregate([ { $group: { _id: null, totalBytes: { $sum: "$length" } } } ]) - 返回的
totalBytes就是所有文件原始大小之和 - 该聚合很快,不扫描
chunks,适合日常监控“逻辑容量” - 不适用于评估磁盘是否快满——那得看
collStats.storageSize
别漏掉索引和旧版本:fs.chunks 的 _id 和 files_id 索引也占空间
默认 GridFS 创建两个索引:fs.chunks._id_ 和 fs.chunks.files_id_1_n_1。它们不算在 fs.chunks 的 storageSize 里,而是计入数据库整体索引空间。但如果你用 db.stats() 看总磁盘用量,这部分已包含。
容易被忽略的点:
- 如果曾大量删除/重传文件,WiredTiger 的旧版本数据可能还没被清理(取决于
storage.wiredTiger.engineConfig.journalCompressor和 checkpoint 频率) -
collStats.storageSize是当前可见的,但后台 compact 或 checkpoint 后可能变化 - 副本集里,不同节点
storageSize可能差几 MB——不是 bug,是压缩时机和内存压力差异导致
真要压准数字,得在低峰期执行 db.runCommand({ "compact": "fs.chunks" })(需停写),再查 collStats。不过日常运维,直接看 collStats.storageSize 已足够指导扩容决策。










