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

MongoDB数组聚合问题:如何拆分$group后的_id对象字段

MongoDB聚合管道调整:拆分_id对象为单独字段

原始文档结构

{
    _id: 573a1390f,
    plot: "A greedy tycoon decides, on a whim, to corner the world market in whea…",
    genres: ["Short", "Drama"],
    countries: ["México", "USA"]
},
{
    _id: 573a1390f,
    plot: "A woman, with the aid of her police officer sweetheart, endeavors to u…",
    genres: ["Drama"],
    countries: ["México", "USA", "Canada"]
}

(注:修正了原始文档的语法错误,genres和countries应为数组格式)

期望输出格式

Country|Genre|Total Rows 
México |Short|1  
México |Drama|2 
USA    |Short|1 
USA    |Drama|2 
Canada |Drama|1

现有管道的问题

你当前的管道完成了数组拆分和分组统计,但分组结果将国家、类型封装在_id对象中,无法直接得到单独字段。另外还存在两处小问题:

  • $Addfields拼写错误,MongoDB操作符区分大小写,正确写法是$addFields
  • $addFields步骤完全冗余,分组时直接用$sum:1即可统计数量

调整后的聚合管道

在分组阶段之后添加$project阶段,将_id内的字段提取为顶层独立字段,同时匹配你需要的命名:

[
  {
    $unwind: { path: "$genres" } // 字段名要和文档内的小写一致,MongoDB字段区分大小写
  },
  {
    $unwind: { path: "$countries" }
  },
  {
    $group: {
      _id: { pais: "$countries", genero: "$genres" },
      Total: { $sum: 1 }
    }
  },
  {
    $project: {
      _id: 0, // 隐藏原始的_id对象
      Country: "$_id.pais",
      Genre: "$_id.genero",
      "Total Rows": "$Total"
    }
  }
]

关键说明

  1. 字段大小写匹配:MongoDB字段名区分大小写,文档内是小写的genres和countries,管道内的路径必须严格对应,否则会找不到字段。
  2. $project的作用:这一步是核心,通过它把_id对象里的pais、genero提取为独立的Country、Genre字段,同时重命名统计字段为Total Rows,并隐藏原始_id。
  3. 冗余步骤移除:之前的$addFields步骤没有实际作用,直接删除即可。

如果需要完全匹配竖线分隔的文本格式,可在客户端对聚合返回的文档结果做格式化处理——MongoDB聚合本身返回的是文档结构,文本格式需自行转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:30:57