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

MongoDB $group阶段如何构造含min/max/avg的嵌套数值统计对象

MongoDB $group阶段输出嵌套统计结构的正确实现

核心原理

$group 阶段的顶层字段值必须为累加器表达式,不支持直接定义嵌套结构,需要先统计所有需要的指标,再通过后续阶段重构嵌套字段格式。

完整聚合管道示例

db.collection.aggregate([
  // 第一步:分组统计所有需要的指标
  {
    $group: {
      _id: "$name",
      // 分组键是name,直接取第一条数据的name即可
      name: { $first: "$name" },
      // 三个统计值先临时存为顶层字段
      tempMin: { $min: "$numericProperty" },
      tempMax: { $max: "$numericProperty" },
      tempAvg: { $avg: "$numericProperty" }
    }
  },
  // 第二步:重构为要求的嵌套结构,清理临时字段
  {
    $addFields: {
      numericProperty: {
        min: "$tempMin",
        max: "$tempMax",
        avg: "$tempAvg"
      },
      // 删除临时统计字段
      tempMin: "$$REMOVE",
      tempMax: "$$REMOVE",
      tempAvg: "$$REMOVE"
    }
  }
])

如果你更习惯用$project阶段,也可以把第二步替换为:

{
  $project: {
    _id: 1,
    name: 1,
    numericProperty: {
      min: "$tempMin",
      max: "$tempMax",
      avg: "$tempAvg"
    }
  }
}

之前报错的原因说明

  • 直接在$group内为numericProperty赋值嵌套统计对象报错:

The field 'numericProperty' must be an accumulator object
原因:$group的顶层字段只能接收累加器表达式作为值,你传入的嵌套对象不属于累加器,不符合$group的语法要求。

  • 在$group内使用$addFields构造嵌套对象报错:

The $addFields accumulator is a unary operator
原因:$addFields是独立的聚合阶段,不是$group支持的累加器运算符,不能写在$group的字段定义里。

  • 使用点分隔符指定嵌套字段名报错:

The field name 'numericProperty.min' cannot contain '.'
原因:$group阶段不支持通过点号直接创建嵌套字段,该语法仅在$set、$project等更新/投影类阶段支持。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:09:04