一日一技:如何找到 MongoDB 占用空间最大的集合?
摄影:产品经理
酒店早餐
我的 MongoDB 上面有很多库,每个库里面有很多集合。他们占用了太多的储存空间。现在我想找到占用空间最大的10个集合,应该如何操作?
如果要查看一个集合占用的硬盘空间,使用 Robo 3T 就能轻松实现:
红框中的storageSize
就是这个集合在硬盘中占用的空间,单位是 Byte。且不说人眼难以区分13144064 Byte到底是130MB 还是1.3GB。光说这个 MongoDB 里面不同数据库总计有上百个集合,我们应该如何查询?
你可以试一试分别使用关键词query size of every collection on MongoDB with pymongo
或者 使用 Pymongo 查询 MongoDB 所有 collection 的大小
。
你会发现,你找不到答案。
而且,如果如果尝试写一些代码,你会发现在 Pymongo 里面,没有类似.stats()
的方法,你甚至无法获取一个集合的大小,如下图所示:
这个时候应该怎么办呢?
实际上,我们使用 Pymongo 也可以直接执行 MongoDB 命令。那就是数据库对象的.command()
方法。例如获取一个集合占用空间的大小,可以写为:
import pymongo
db = pymongo.MongoClient().Meituan
stats = db.command('collstats', 'id_place')
它返回的是一个字典,内容跟在 Robo 3T 执行.stats()
的效果是一样的。如下图所示。
要获取占用硬盘的大小,只需要执行stats['storageSize']
即可。
所以,我们可以使用如下代码来获取所有集合的大小并排序:
import pymongo
all_data = {}
conn = pymongo.MongoClient()
db_list = conn.database_names()
for db_name in db_list:
db = conn[db_name]
collections = db.collection_names()
for collection_name in collections:
storage = db.command('collstats', collection_name)['storageSize']
all_data[f'{db_name}.{collection_name}'] = storage / 1024 / 1024 # 使用 MB 作为单位
usage = sorted(all_data.items(), key=lambda x: x[1], reverse=True)
print('占用空间最大的前10个集合:')
print(usage[:10])
运行效果如下图所示:
需要注意的是,由于我的 Jupyter 中使用的 PyMongo 版本比较老,所以列出数据库用到的是conn.database_names()
,列出集合用到的是db.collection_names()
。如果你的 PyMongo 版本比较新,那么你需要使用conn.list_database_names()
和db.list_collection_names
。
- 在WINDOWS下交叉编译LINUX程序运行不了是为什么?
- Hibernate的缓存机制
- error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http:/
- 【Go 语言 redis内存数据库存储 demo】
- linux下基本操作记录mongodb
- ClassLoader究竟为何物?
- Oracle应用实战八(完结)——存储过程、函数+对象曹组
- 动态代理模式原理
- SQL可以正常用,但cmd启动不了mysql,报错[ERROR] unknown variable ;basedir=....问题
- Percona-toolkit的安装和配置(r8笔记第86天)
- 分布式服务框架 Zookeeper
- python--类方法、对象方法、静态方法
- Go语言内存分配器的实现
- Go 语言 数据库操作之链接数据库实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- std::vector扩容机制,.按1.5倍取整扩容,如下。
- 求一个数的临近的较大的2的整数次幂
- 在文件IO操作中,合理使用缓存。
- Flutter基础widgets教程-Drawer篇
- C++ 实现可变参数
- C++ 单例模式
- c++ 日志类 线程安全+缓存
- C++ 实现通过类名来进行实例化(反射机制?)
- Flutter基础widgets教程-ExpansionPanel篇
- muduo TcpServer粗略过程
- muduo 超时重连
- EventLoop,TcpClient,TcpServer 中的生命周期
- functional 和 bind 用法
- Flutter基础widgets教程-FittedBox篇
- muduo Dispatcher消息分发器 通过多态和模板进行向上类型转换