MongoDB/Mongoose按性别分组聚合姓名至数组的实现问题
MongoDB按性别聚合姓名数组的正确写法
需求
将students集合中相同性别的文档的name字段聚合到对应的names数组中,最终按性别分组输出,且无法预先知晓所有性别/姓名组合。
输入示例
db.students.insertMany([ { id: 1, name: "Ryan", gender: "M" }, { id: 2, name: "Joanna", gender: "F" }, { id: 3, name: "Andy", gender: "M" }, { id: 4, name: "Irina", gender: "F" } ]);
期望输出
[ { gender: "M", names: ["Ryan","Andy"]}, { gender: "F", names: ["Joanna","Irina"]} ]
错误查询分析
你之前的查询有两个关键问题:
$group阶段缺少必填的_id字段,$group必须通过_id指定分组依据(这里应该按gender分组)- 后续的
$match阶段逻辑错误,"gender": "$gender"的写法无法生效,且$match放在$group之后不符合需求逻辑。
正确聚合查询
db.students.aggregate([ { $group: { _id: "$gender", // 以gender为分组依据 names: { $push: "$name" } // 收集同组的name字段到names数组 } }, { $project: { _id: 0, // 隐藏默认的_id字段 gender: "$_id", // 将分组用的_id映射为gender字段 names: 1 // 保留names数组 } } ])
逻辑说明
$group阶段:通过_id: "$gender"把相同性别的文档归为一组,用$push操作符将每组内的name字段逐个添加到names数组中。$project阶段:调整输出结构,把分组标识_id重命名为gender,同时隐藏原始的_id字段,最终输出符合预期的格式。
如果使用Mongoose,写法和上述MongoDB shell命令完全一致,直接在对应的Model上调用aggregate()方法即可。
内容的提问来源于stack exchange,提问作者Andrei Ianc
相关产品推荐
相关产品推荐

