MongoDB多字段分组实现按用户输出单文档的聚合查询问题
解决方案
你只需要在现有$group阶段后追加两次聚合阶段即可,完整查询语句如下:
db.characters.aggregate([ // 按用户+公会分组,汇总单个公会下的角色列表 { $group: { _id: { user: "$user", guild: "$guild" }, characters: { $push: "$character" } } }, // 按用户二次分组,整理所有公会的角色数据为键值对数组 { $group: { _id: "$_id.user", guildList: { $push: { k: "$_id.guild", v: "$characters" } } } }, // 转换为目标输出结构 { $project: { _id: 0, user: "$_id", characters: { $arrayToObject: "$guildList" } } } ])
逻辑说明
- 第一个
$group是你已有的逻辑,得到「用户+公会」维度的角色列表。 - 第二个
$group把同一个用户的所有公会数据归集,生成格式为[{k: 公会标识, v: 对应角色数组}]的列表。 - 最后的
$project阶段做两件事:调整字段名输出user字段,用MongoDB内置的$arrayToObject操作符把上面的键值对数组直接转换为目标characters对象结构。
内容的提问来源于stack exchange,提问作者tiltowait
相关产品推荐
相关产品推荐

