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

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
    }
  }
]

步骤说明

  1. $addFields阶段:
    • affectedComputers:用$size直接获取数组长度,替换原数组字段。
    • typeMap:通过$map遍历typeCount数组,将每个元素转换为{k: 小写类型名, v: count}的格式,再用$arrayToObject把数组转成键值对对象(比如{system: 1002, application: 3065})。
  2. $project阶段:
    • 使用$ifNull检查typeMap中是否存在application和system键,存在则取对应值,不存在则设为0。
    • 保留处理后的affectedComputers字段。

特殊情况处理

如果typeCount数组中只存在其中一种类型(比如只有System没有Application),$ifNull会自动将缺失的字段值设为0,完全符合需求。

内容的提问来源于stack exchange,提问作者TheStranger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:50:32