You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:52:25