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

MongoDB聚合查询求助:如何用$match与$group生成目标数据格式

MongoDB聚合查询:按表单分组整理数据

原始数据(Answer集合)

[ {
    _id: new ObjectId("6357b4237cf79bba3e66c096"),
    userId: new ObjectId("635762fe85b94eac7466d965"),
    formId: new ObjectId("6357921d49de88bb7fffcfe4"),
    title: 'Quality',
    username: 'Jansenstan24@gmail.coms',
    date: '2022-10-25',
    answer: {
      '6357921d49de88bb7fffcfe8': 'john@nabatisnack.com',
      Text: 'john@nabatisnack.com',
      '6357b331235053a9d4e8d037': 'john@dose.com',
      Email: 'john@dose.com',
      '6357b335235053a9d4e8d03a': 'Maja',
      Plant: 'Maja'
    },
    createdAt: 1666692131,
    updatedAt: 1666692131,
    __v: 0
  },
  {
    _id: new ObjectId("6357b54922866fae378af370"),
    userId: new ObjectId("635762fe85b94eac7466d965"),
    formId: new ObjectId("6357921d49de88bb7fffcfe4"),
    title: 'Quality',
    username: 'Jansenstan24@gmail.coms',
    date: '2022-10-25',
    answer: {
      '6357921d49de88bb7fffcfe8': 'john@dose.com',
      Text: 'john@dose.com',
      '6357b331235053a9d4e8d037': 'john@nabatisnack.com',
      Email: 'john@nabatisnack.com',
      '6357b335235053a9d4e8d03a': 'Cica',
      Plant: 'Cica'
    },
    createdAt: 1666692425,
    updatedAt: 1666692425,
    __v: 0
  },
  {
    _id: new ObjectId("6357b6a2a13ab3c4a462be8f"),
    userId: new ObjectId("635647c1e24d0a4482e3c0a9"),
    formId: new ObjectId("6357921d49de88bb7fffcfe4"),
    title: 'Quality',
    username: 'adam@wegodev.com',
    date: '2022-10-25',
    answer: {
      '6357921d49de88bb7fffcfe8': '12',
      Text: '12',
      '6357b331235053a9d4e8d037': 'john@dose.coms',
      Email: 'john@dose.coms',
      '6357b335235053a9d4e8d03a': 'Ranca',
      Plant: 'Ranca'
    },
    createdAt: 1666692770,
    updatedAt: 1666692770,
    __v: 0
  }]

当前错误的聚合尝试

forms = await Answer.aggregate([
          {
            $match: { title: "Quality" },
          },
          { $group: { title: "Quality"} },

        ]);

期望的输出格式

{
    formId: new ObjectId("6357921d49de88bb7fffcfe4"),
    title: 'Quality',
    username: ['Jansenstan24@gmail.coms','adam@wegodev.com'],
    date: ['2022-10-25'],
    answer: [{
      '6357921d49de88bb7fffcfe8': 'john@nabatisnack.com',
      Text: 'john@nabatisnack.com',
      '6357b331235053a9d4e8d037': 'john@dose.com',
      Email: 'john@dose.com',
      '6357b335235053a9d4e8d03a': 'Maja',
      Plant: 'Maja'
    },{
      '6357921d49de88bb7fffcfe8': 'john@dose.com',
      Text: 'john@dose.com',
      '6357b331235053a9d4e8d037': 'john@nabatisnack.com',
      Email: 'john@nabatisnack.com',
      '6357b335235053a9d4e8d03a': 'Cica',
      Plant: 'Cica'
    },{
      '6357921d49de88bb7fffcfe8': '12',
      Text: '12',
      '6357b331235053a9d4e8d037': 'john@dose.coms',
      Email: 'john@dose.coms',
      '6357b335235053a9d4e8d03a': 'Ranca',
      Plant: 'Ranca'
    }],
  }

正确的聚合查询写法

forms = await Answer.aggregate([
  // 筛选目标表单数据
  { $match: { title: "Quality" } },
  // 按表单分组聚合字段
  {
    $group: {
      _id: { formId: "$formId", title: "$title" },
      username: { $addToSet: "$username" },
      date: { $addToSet: "$date" },
      answer: { $push: "$answer" }
    }
  },
  // 调整输出结构,匹配期望格式
  {
    $project: {
      _id: 0,
      formId: "$_id.formId",
      title: "$_id.title",
      username: 1,
      date: 1,
      answer: 1
    }
  }
]);

关键步骤说明

  • $match:精准过滤title为Quality的文档,减少聚合计算的数据量。
  • $group:
    • 以formId和title作为分组依据,确保同一表单的数据被聚合到一起。
    • $addToSet:收集去重的username和date,避免重复值。
    • $push:将每个文档的answer对象完整添加到数组中,保留所有提交的答案。
  • $project:重新组织输出结构,将_id中的字段提取为顶层字段,并移除默认的_id字段,完全匹配期望的格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:30:46