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

MongoDB按用户聚合嵌套文档投票评分总和的实现问题

MongoDB投票应用:计算每个用户的投票评分总和

问题分析

你当前的聚合查询存在两个核心问题:

  1. $group的_id: null会将所有用户的投票总和合并成一个结果,无法得到每个用户单独的评分总和。
  2. $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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:16:05