如何使用Mongoose计算每个模型文档中关联votes的score总和
问题原因
你当前主集合的votes字段存储的是投票文档的ObjectId引用,并非内嵌的完整投票对象,直接在聚合中访问$$this.score时,$$this本身是ID值,不存在score属性,所以返回null。
解决方案
需要先通过$lookup关联投票集合,将ID数组填充为完整的投票文档数组,再进行分数累加计算,完整聚合语句如下:
MyModel.aggregate([ // 第一步:关联投票集合,填充votes数组为完整文档 { $lookup: { from: "votes", // 投票集合的实际名称,对应Vote模型的集合名 localField: "votes", foreignField: "_id", as: "votes" } }, // 第二步:计算累加得分 { $addFields: { scoreSum: { $sum: "$votes.score" // 直接对votes数组下所有score字段求和,比$reduce写法更简洁 } } }, // 可选:如果要和预期输出结构完全一致,去掉votes字段、保留原有其他字段 { $project: { votes: 0 } } ])
补充说明
上述方案完全在数据库层面完成计算,不需要额外的JavaScript处理。如果你在Mongoose模型中为votes字段配置了ref: "Vote"关联,也可以结合虚拟字段实现相同效果,但聚合方案的执行效率更高。
内容的提问来源于stack exchange,提问作者Anton Kalik
相关产品推荐
相关产品推荐

