直接调用 collstats 命令可准确获取集合磁盘占用,返回 size(文档原始字节)、storagesize(实际磁盘占用,含填充和索引)、totalsize(含索引总空间),需在目标数据库执行并推荐加 {"scale": 1024} 转为 kb。

直接调用 collStats 命令获取集合大小
Python 驱动(pymongo)不提供封装好的“查磁盘占用”方法,但 MongoDB 原生支持 collStats 命令,它返回包括 size(文档原始字节)、storageSize(实际磁盘占用,含填充和索引)、totalSize(含索引总空间)等关键字段。你得手动发命令,不能靠 collection.count_documents({}) 或估算。
实操建议:
- 必须在目标集合所在数据库上下文中执行,不是在
admin或其他库 - 命令是字典形式:
{"collStats": "your_collection_name"},注意键名大小写敏感,值是字符串集合名 - 推荐加
{"scale": 1024}把字节数转为 KB,避免数值过大难读 - 示例:
db.command({"collStats": "logs", "scale": 1024})
用 pymongo 执行并解析 collStats 返回值
返回结果是字典,字段含义容易混淆:size 是所有文档 BSON 序列化后总长(不含索引),storageSize 才是你在 mongod 磁盘上看到的 .wt 文件实际占用(含 padding、压缩、碎片),而 totalSize = storageSize + 所有索引的 storageSize。
常见错误现象:
- 误把
count× 平均文档大小 当作size—— BSON 编码开销、空字段存储、_id 类型都会导致偏差 - 忽略
scale参数,拿到几百万字节却以为是 MB - 对 capped collection 调用时没注意
capped字段为True,但max和size字段只在创建时生效,运行时不反映当前占用
建议提取逻辑:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
res = db.command({"collStats": "events", "scale": 1024})
print(f"数据大小: {res['size']} KB")
print(f"存储占用: {res['storageSize']} KB")
print(f"含索引总占: {res['totalSize']} KB")
批量统计多个集合时注意权限与性能影响
如果你要遍历 db.list_collection_names() 逐个跑 collStats,得确认连接用户有 collStats 权限(通常需 read 角色以上,某些部署要求 dbAdmin)。本地开发环境常忽略这点,一上线就报 Command collStats failed: not authorized。
性能方面:collStats 是轻量元数据读取,不扫描文档,但频繁调用仍会增加 mongod 的命令解析压力。生产环境建议:
- 避免在高并发请求中实时调用,可定时写入监控集合缓存结果
- 跳过系统集合(如
system.*)和空集合(count == 0时storageSize可能非零,但通常可忽略) - 对大集合,
collStats响应快;但若启用了 WiredTiger 压缩,storageSize已是解压后视图,无需额外计算
对比 db.collection.stats() 与原生命令的区别
pymongo 的 Collection.stats() 方法本质就是封装了 collStats 命令,但它默认不带 scale,且部分旧版本(pymongo )会静默丢弃未知字段,导致拿不到 <code>freeStorageSize 等新字段。所以更推荐直调 db.command()。
关键差异点:
-
collection.stats()返回字段可能被驱动截断或类型转换(比如avgObjSize强制转 float,丢失精度) - 原生命令可传任意参数,例如
{"collStats": "...", "indexDetails": True}查索引细节,而.stats()不支持 - 当集合名含特殊字符(如短横线、点号),用
.stats()可能因属性访问语法报错,但db.command()无此问题
真正容易被忽略的是:WiredTiger 引擎下,storageSize 包含 page cache 影响,同一时刻多次调用可能有几十 KB 波动——这不是 bug,是引擎内部状态导致的正常现象。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










