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" } } ]
关键说明
- 字段大小写匹配:MongoDB字段名区分大小写,文档内是小写的
genres和countries,管道内的路径必须严格对应,否则会找不到字段。 - $project的作用:这一步是核心,通过它把
_id对象里的pais、genero提取为独立的Country、Genre字段,同时重命名统计字段为Total Rows,并隐藏原始_id。 - 冗余步骤移除:之前的
$addFields步骤没有实际作用,直接删除即可。
如果需要完全匹配竖线分隔的文本格式,可在客户端对聚合返回的文档结果做格式化处理——MongoDB聚合本身返回的是文档结构,文本格式需自行转换。
内容的提问来源于stack exchange,提问作者JPmerino24
相关产品推荐
相关产品推荐

