MongoDB按用户聚合嵌套文档投票评分总和的实现问题
MongoDB投票应用:计算每个用户的投票评分总和
问题分析
你当前的聚合查询存在两个核心问题:
$group的_id: null会将所有用户的投票总和合并成一个结果,无法得到每个用户单独的评分总和。$unwind默认会忽略空数组或缺失字段的文档,且当投票对象中没有rating字段时,会触发Location40324错误(对应错误码40324)。
另外,部分用户的投票数据中缺少rating字段,计算时需要处理这种情况,避免总和计算不准确。
修正后的聚合代码
getAllPersons(req, res) { Person.aggregate( [ // 展开votes数组,保留空数组或缺失该字段的文档 { $unwind: { path: "$votes", preserveNullAndEmptyArrays: true } }, // 按用户ID分组,计算每个用户的评分总和,同时保留用户基本信息 { $group: { _id: "$_id", name: { $first: "$name" }, img: { $first: "$img" }, vote_sum: { $sum: { $ifNull: ["$votes.rating", 0] } } } } ], (err, result) => { if (err) { res.status(500).send(err); } else { res.status(200).send(result); } } ); }
代码说明
$unwind添加preserveNullAndEmptyArrays: true:确保即使用户没有投票(votes数组为空)或投票对象缺失,文档也会被保留,避免触发Location40324错误。$group的_id: "$_id":按用户ID分组,确保每个用户的结果独立。$first: "$name"/$first: "$img":因为每个用户的name和img是唯一的,用$first或$last可以保留这些字段。$ifNull: ["$votes.rating", 0]:当投票对象中没有rating字段时,用0代替,保证总和计算的准确性。
预期输出
修正后会返回每个用户的基本信息和对应的评分总和,示例如下:
[ { "_id": "63964b3f9677c609e9c81054", "name": "Gordie Howe", "img": "./assets/gordie-howe.png", "vote_sum": 3 }, { "_id": "63964b3f9677c609e9c81059", "name": "Gordon", "img": "./assets/gordon.png", "vote_sum": 0 } ]
内容的提问来源于stack exchange,提问作者AWilford
相关产品推荐
相关产品推荐

