MongoDB聚合:如何从对象数组提取值并补零?
解决方案
要实现你想要的结果,可以通过MongoDB聚合管道中的$arrayToObject、$map和$ifNull操作提取typeCount中的对应值,并处理缺失值设为0的情况,同时保留affectedComputers的长度。完整的聚合管道如下:
[ // 第一步:转换affectedComputers为长度,同时将typeCount转为键值对对象 { $addFields: { affectedComputers: { $size: "$affectedComputers" }, typeMap: { $arrayToObject: { $map: { input: "$typeCount", as: "item", in: { k: { $toLower: "$$item._id" }, // 将_id转为小写,匹配目标字段名 v: "$$item.count" } } } } } }, // 第二步:提取目标字段,缺失时设为0 { $project: { application: { $ifNull: ["$typeMap.application", 0] }, system: { $ifNull: ["$typeMap.system", 0] }, affectedComputers: 1 } } ]
步骤说明
$addFields阶段:affectedComputers:用$size直接获取数组长度,替换原数组字段。typeMap:通过$map遍历typeCount数组,将每个元素转换为{k: 小写类型名, v: count}的格式,再用$arrayToObject把数组转成键值对对象(比如{system: 1002, application: 3065})。
$project阶段:- 使用
$ifNull检查typeMap中是否存在application和system键,存在则取对应值,不存在则设为0。 - 保留处理后的
affectedComputers字段。
- 使用
特殊情况处理
如果typeCount数组中只存在其中一种类型(比如只有System没有Application),$ifNull会自动将缺失的字段值设为0,完全符合需求。
内容的提问来源于stack exchange,提问作者TheStranger
相关产品推荐
相关产品推荐

