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

Node.js中MongoDB $sum聚合返回0,求正确统计总和的方法

问题

使用NYT的us-counties-2020.csv数据,在Node.js中通过以下MongoDB聚合管道统计各州累计病例数和死亡数:

const pipeline = [
  { $group: {
      _id: "$state",
      deaths: { $sum: "$deaths" },
      cases: { $sum: "$cases" },
   }},
   { $limit: 10 }
]

预期返回各州的死亡数和病例数总和,但实际结果中两个字段均为0,输出如下:

{ _id: 'Rhode Island', deaths: 0, cases: 0 }
{ _id: 'Florida', deaths: 0, cases: 0 }
{ _id: 'South Carolina', deaths: 0, cases: 0 }
{ _id: 'Vermont', deaths: 0, cases: 0 }
{ _id: 'Missouri', deaths: 0, cases: 0 }
{ _id: 'Maine', deaths: 0, cases: 0 }
{ _id: 'District of Columbia', deaths: 0, cases: 0 }
{ _id: 'Tennessee', deaths: 0, cases: 0 }
{ _id: 'Ohio', deaths: 0, cases: 0 }
{ _id: 'California', deaths: 0, cases: 0 }

如何正确获取死亡数和病例数的总和?

原因分析

核心问题是MongoDB中的cases和deaths字段被存储为字符串类型,而$sum运算符对字符串值会默认视为0计算,最终导致总和为0。

解决方案

1. 验证字段类型

在MongoDB Shell中执行以下命令(替换yourCollection为你的集合名称),确认字段类型:

db.yourCollection.findOne({}, { cases: 1, deaths: 1, _id: 0 })

若返回结果类似{ cases: "123", deaths: "45" },则证实字段为字符串类型。

2. 批量转换字段类型

使用updateMany将所有文档的cases和deaths字段转为整数类型:

db.yourCollection.updateMany(
  {},
  [
    { $set: {
      cases: { $toInt: "$cases" },
      deaths: { $toInt: "$deaths" }
    }}
  ]
)

执行后再次验证字段类型,确认已转为数字。

3. 重新运行聚合管道

原聚合管道逻辑正确,字段类型修复后重新执行,即可得到各州正确的病例数和死亡数总和。

4. 导入时的预防措施

后续导入CSV数据时,直接指定字段类型避免重复问题。例如使用mongoimport命令:

mongoimport --uri "mongodb://your-host:port/your-db" \
  --collection yourCollection \
  --type csv \
  --headerline \
  --columnsHaveTypes \
  --fields "date(date),county(string),state(string),fips(int),cases(int),deaths(int)"

确保cases和deaths字段直接以整数类型存入数据库。


内容的提问来源于stack exchange,提问作者Sennri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:20:49