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

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数组
    }
  }
])

逻辑说明

  1. $group阶段:通过_id: "$gender"把相同性别的文档归为一组,用$push操作符将每组内的name字段逐个添加到names数组中。
  2. $project阶段:调整输出结构,把分组标识_id重命名为gender,同时隐藏原始的_id字段,最终输出符合预期的格式。

如果使用Mongoose,写法和上述MongoDB shell命令完全一致,直接在对应的Model上调用aggregate()方法即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:01:04