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
相关产品推荐
相关产品推荐

