使用GlideAggregate统计cmdb_rel_ci表特定关系类型parent.sys_class_name遇空值问题
解决GlideAggregate查询cmdb_rel_ci时parent.sys_class_name为空的问题
刚看到你的问题,我之前在ServiceNow里用GlideAggregate处理关联表统计时也踩过类似的坑,className为空大概率是这几个原因导致的,给你整理下解决方案:
核心问题分析
你要统计的parent.sys_class_name是关联表(parent指向的CI表)的字段,直接用GlideAggregate时如果没处理好关联查询、分组逻辑或者关系类型的匹配条件,就会出现字段为空的情况。
正确的实现代码
方案1:用关系类型显示名称查询(不推荐,易受名称变更影响)
var agg = new GlideAggregate('cmdb_rel_ci'); // 匹配目标关系类型 agg.addQuery('type', 'Depends on::Used by'); // 按parent的sys_class_name分组统计数量 agg.addAggregate('COUNT', 'parent.sys_class_name'); agg.groupBy('parent.sys_class_name'); agg.query(); // 遍历输出结果 while (agg.next()) { var className = agg.getValue('parent.sys_class_name'); var totalCount = agg.getAggregate('COUNT', 'parent.sys_class_name'); gs.info(`CI类名:${className},关联数量:${totalCount}`); }
方案2:用关系类型sys_id查询(推荐,更稳定)
因为关系类型的显示名称可能会被修改,直接用sys_id匹配更可靠:
// 先获取目标关系类型的sys_id var relTypeGR = new GlideRecord('cmdb_rel_type'); relTypeGR.addQuery('name', 'Depends on::Used by'); relTypeGR.query(); if (relTypeGR.next()) { var agg = new GlideAggregate('cmdb_rel_ci'); agg.addQuery('type', relTypeGR.sys_id); agg.addAggregate('COUNT', 'parent.sys_class_name'); agg.groupBy('parent.sys_class_name'); agg.query(); while (agg.next()) { var className = agg.getValue('parent.sys_class_name'); var totalCount = agg.getAggregate('COUNT', 'parent.sys_class_name'); gs.info(`CI类名:${className},关联数量:${totalCount}`); } } else { gs.error('未找到关系类型"Depends on::Used by",请检查名称是否正确'); }
你之前可能踩的坑
- 未添加
groupBy语句:如果只加了addAggregate但没指定groupBy('parent.sys_class_name'),GlideAggregate只会返回一个总数量,无法提取每个分组的sys_class_name,自然显示为空。 - 关系类型匹配错误:如果直接用显示名称查询
type字段,但系统中该关系类型的实际存储值(比如sys_id)和显示名称不匹配,会导致没有查询到任何结果,className自然为空。 - 字段引用错误:比如误写为
sys_class_name(这会取cmdb_rel_ci表自身的类名,而非parent关联CI的类名),或者拼写错误成parent.class_name。 - 权限问题:当前执行脚本的角色没有权限访问parent关联CI表的
sys_class_name字段,也会导致返回空值,可以检查角色权限配置。
内容的提问来源于stack exchange,提问作者Done With Fun
相关产品推荐
相关产品推荐

