MongoDB聚合查询中$sum始终返回0问题求助
问题根源
你遇到的问题核心是**lodging.reviews是数组类型**,直接通过$lodging.reviews.cleanliness引用的是包含该住宿所有评论中清洁评分的数组,而非单个数值。$sum在处理多个数组作为参数时,会将数组视为非数值类型,最终求和结果只能是0。
解决方案
根据你的实际需求,有两种修正方式:
需求1:统计每个住宿的所有评论三项评分总和的组合(以住宿为单位)
如果要计算单家住宿所有评论的清洁分总和+位置分总和+食物分总和,再统计不同总和对应的住宿数量,使用以下查询:
db.test.aggregate([ {$addFields: { sumPoints: {$add: [ {$sum: "$lodging.reviews.cleanliness"}, {$sum: "$lodging.reviews.location"}, {$sum: "$lodging.reviews.food"} ]} }}, {$group: { _id: "$sumPoints", count: {$sum: 1} }}, {$sort: {count: 1}}, {$project: {_id: 0, count: 1, sumPoints: "$_id"}} ])
这里先用$sum对每个评分字段的数组元素求和,再用$add将三个总和相加得到单家住宿的总评分。
需求2:统计单条评论三项评分总和的组合(以评论为单位)
如果要计算每条评论的三项评分之和,再统计不同总和对应的评论数量(注意:一家住宿多条评论会被拆分统计),需要先展开评论数组:
db.test.aggregate([ {$unwind: "$lodging.reviews"}, {$addFields: { sumPoints: {$sum: [ "$lodging.reviews.cleanliness", "$lodging.reviews.location", "$lodging.reviews.food" ]} }}, {$group: { _id: "$sumPoints", count: {$sum: 1} }}, {$sort: {count: 1}}, {$project: {_id: 0, count: 1, sumPoints: "$_id"}} ])
通过$unwind将每个评论拆分为独立文档,此时$lodging.reviews.cleanliness引用的就是单个评论的数值,$sum可以正常计算三项评分之和。
内容的提问来源于stack exchange,提问作者Daniel Rodriguez Sanchez
相关产品推荐
相关产品推荐

