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

MongoDB报Unrecognized expression '$push' 按subject、topic、subtopic分组求解

报错原因

$push 是$group阶段的顶层累加操作符,不支持嵌套在$addToSet的内部表达式中使用,你当前的写法直接把$push放在了$addToSet的字段定义里,因此MongoDB无法识别这个表达式。

正确聚合实现

要实现subject -> topic -> subtopic的三级分组结构,你需要分两次$group完成聚合:

  1. 第一次联合subject和topic作为分组主键,先归集每个topic下的所有subtopic
  2. 第二次仅按subject作为分组主键,将同subject下的所有topic组装成目标数组结构

完整聚合管道代码如下:

db.collection.aggregate([
  // 第一次分组:按subject + topic联合分组,归集subtopic
  {
    $group: {
      _id: {
        subject: "$subject",
        topic: "$topic"
      },
      subtopics: { $push: "$subtopic" }
    }
  },
  // 第二次分组:仅按subject分组,组装topics数组结构
  {
    $group: {
      _id: "$_id.subject",
      topics: {
        $push: {
          topicName: "$_id.topic",
          subtopics: "$subtopics"
        }
      }
    }
  },
  // 可选:调整输出字段名,把_id改为subject
  {
    $project: {
      _id: 0,
      subject: "$_id",
      topics: 1
    }
  }
])
输出说明

针对你给出的示例数据,上面的聚合会输出如下结果:

{
  "subject": "app development",
  "topics": [
    {
      "topicName": "dart",
      "subtopics": ["flutter2", "flutter"]
    },
    {
      "topicName": "javascript",
      "subtopics": ["react native"]
    }
  ]
}

如果需要对topic或者subtopic去重,把对应位置的$push换成$addToSet即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:09:03