MongoDB查询所有集合及存储大小遇权限错误求助
解决MongoDB查询所有集合存储大小的权限错误问题
你的错误是因为代码尝试访问system.views集合(MongoDB的系统视图集合),但当前用户没有该集合的操作权限。视图本身不存储数据,统计其存储大小没有意义,可通过以下两种方式解决:
方案1:跳过系统集合(推荐)
直接过滤掉以system.开头的集合,避免访问无权限的系统视图:
var dbs = db.getMongo().getDBNames(); for (adb of dbs) { var dbObj = db.getSiblingDB(adb); // 只保留普通业务集合,排除所有系统集合 var colls = dbObj.getCollectionNames().filter(coll => !coll.startsWith("system.")); for (coll of colls) { var info = dbObj.getCollection(coll).stats(1024); if (info.ok) { print('Ns:' + info.ns + ' Storage Size:' + info.storageSize + ' KB'); } } }
方案2:添加异常捕获,跳过无权限集合
如果需要保留对部分系统集合的访问,可通过try-catch捕获权限错误,继续处理其他集合:
var dbs = db.getMongo().getDBNames(); for (adb of dbs) { var dbObj = db.getSiblingDB(adb); var colls = dbObj.getCollectionNames({ type: "collection" }); for (coll of colls) { try { var info = dbObj.getCollection(coll).stats(1024); if (info.ok) { print('Ns:' + info.ns + ' Storage Size:' + info.storageSize + ' KB'); } } catch (e) { // 仅跳过权限错误,其他异常正常抛出以便排查 if (!e.message.includes("not authorized")) { throw e; } } } }
补充说明
getCollectionNames({ type: "collection" })在部分环境中仍可能返回system.views,直接过滤system.前缀的兼容性更强。- 视图本身不占用物理存储,跳过这类集合不会影响业务数据的统计结果。
内容的提问来源于stack exchange,提问作者matteo.locci
相关产品推荐
相关产品推荐

