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

MongoDB聚合统计时如何合并两种结构同名字段的同值数据

解决方法

不用改存量数据,在聚合管道里加一个统一取值的阶段再分组即可。

核心逻辑是用$type判断value的字段类型:如果是对象类型,就取嵌套的value.value当实际统计值;如果是字符串类型,直接取value本身,之后用这个统一后的值做分组键,就能把同值不同结构的数据归到同一组统计。

调整后的完整代码:

let data: any = await this.dataModel.aggregate(
  [
    {
      $match: {
        field: new ObjectID(fieldID),
      },
    },
    // 统一提取实际统计值作为分组键
    {
      $addFields: {
        group_key: {
          $cond: [
            { $eq: [{ $type: "$value" }, "object"] },
            "$value.value",
            "$value"
          ]
        }
      }
    },
    {
      $group: {
        _id: "$group_key",
        total_for_value: { $sum: 1 },
      },
    },
    // 不需要临时生成的分组键字段可以加这步移除
    {
      $project: {
        group_key: 0
      }
    }
  ]
);

补充说明

  • MongoDB 4.2以上版本可以把$addFields换成$set,语义更直观,执行效果完全一致
  • 如果存在脏数据比如嵌套结构里缺失value属性,可以在条件判断里再加一层非空校验,避免分组时出现不必要的null分组
  • 这个写法没有额外性能损耗,和原聚合的执行效率基本一致,不需要提前清洗历史数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:39:02