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
相关产品推荐
相关产品推荐

