如何编写MongoDB查询按年龄分组并返回数组的数组?
解决MongoDB按age分组并返回数组的数组问题
问题分析
你之前的聚合查询报错,是因为$group阶段中,除_id外的字段必须使用MongoDB的累加器操作符(如$push、$sum),直接引用字段"$name"不符合语法规则。要实现按age分组并返回数组的数组格式,需要分阶段构建聚合逻辑。
完整聚合查询
db.users.aggregate([ // 按age分组,将用户信息转换为预期格式并存入数组 { $group: { _id: "$age", userGroup: { $push: { _id: "$_id", name: "$name", class: { $cond: [{ $eq: ["$age", 22] }, 2, 5] } } } } }, // 将所有分组的用户数组收集为一个大数组 { $group: { _id: null, result: { $push: "$userGroup" } } }, // 清理输出字段,只保留结果数组 { $project: { _id: 0, result: 1 } } ])
各阶段说明
- 第一阶段
$group:- 按
age字段分组,使用$push累加器将每个用户的_id、name存入数组,同时通过$cond将age映射为预期的class值(22→2,30→5)。
- 按
- 第二阶段
$group:- 以
_id: null聚合所有分组结果,将每个分组的userGroup数组推入result大数组,形成“数组的数组”结构。
- 以
- 第三阶段
$project:- 移除默认的
_id字段,只输出result字段,得到符合要求的最终格式。
- 移除默认的
注意事项
如果不需要映射class字段,仅保留原用户结构,可将第一阶段的$push改为直接引用整个文档:
$push: { _id: "$_id", name: "$name", age: "$age" }
内容的提问来源于stack exchange,提问作者guirms
相关产品推荐
相关产品推荐

