首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:如何找到 MongoDB 占用空间最大的集合?

一日一技:如何找到 MongoDB 占用空间最大的集合?

作者头像
青南
发布2020-08-27 10:30:14
2.6K0
发布2020-08-27 10:30:14
举报
文章被收录于专栏:未闻Code未闻Code

摄影:产品经理

酒店早餐

我的 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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档