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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:00:55