首先想到的是mongodb的聚合函数,具体操作如下:
表数据
db.test3.find({},{'content.targetCode':1,'content.result':1})
![mongodb3.4字符类型的字段求和 mongodb3.4字符类型的字段求和](https://image.shishitao.com:8440/aHR0cHM6Ly9zMi41MWN0by5jb20vaW1hZ2VzL2Jsb2cvMjAyMjEyLzA2MDgyNTU4XzYzOGU4YzE2YzZkYjgxNDc1MC5wbmc%3D.png?w=700&webp=1)
使用聚合函数进行统计
db.test3.aggregate(
[{
"$match": {
"content.targetCode":'patExam'
}
},
{
"$group": {
"_id": null,
"Total": {
"$sum": "$content.result"
}
}
}
])
![mongodb3.4字符类型的字段求和 mongodb3.4字符类型的字段求和](https://image.shishitao.com:8440/aHR0cHM6Ly9zMi41MWN0by5jb20vaW1hZ2VzL2Jsb2cvMjAyMjEyLzA2MDgyNjUwXzYzOGU4YzRhMDM3MDUyODg0NC5wbmc%3D.png?w=700&webp=1)
上面的结果为0,聚集函数无法对字符型的字段求和,要想求和有以下2个方案:
1.采用mapReduce(将字符串转换成浮点型)
var map = function(){
emit(this.content.targetCode,this.content.result);
}
var reduce = function(key,values){
var cnt = 0.0;
values.forEach(function(val){cnt+=parseFloat(val);});
return {"sumAll":cnt};
}
db.test3.mapReduce(map,reduce,{query:{},out:'res'})
db.res.find()
![mongodb3.4字符类型的字段求和 mongodb3.4字符类型的字段求和](https://image.shishitao.com:8440/aHR0cHM6Ly9zMi41MWN0by5jb20vaW1hZ2VzL2Jsb2cvMjAyMjEyLzA2MDgyNzI4XzYzOGU4YzcwYjQyMjk4NzA3Mi5wbmc%3D.png?w=700&webp=1)
统计完成后记得删除临时表res
2.修改原始数据将其由字符型改为浮点型
修改前的数据
![mongodb3.4字符类型的字段求和 mongodb3.4字符类型的字段求和](https://image.shishitao.com:8440/aHR0cHM6Ly9zMi41MWN0by5jb20vaW1hZ2VzL2Jsb2cvMjAyMjEyLzA2MDgyODM2XzYzOGU4Y2I0MjVmMTI0NDcyNC5wbmc%3D.png?w=700&webp=1)
修改后的数据
db.test3.find().forEach( function (x) {x.content.result = parseFloat(x.content.result);db.test3.save(x);})
![mongodb3.4字符类型的字段求和 mongodb3.4字符类型的字段求和](https://image.shishitao.com:8440/aHR0cHM6Ly9zMi41MWN0by5jb20vaW1hZ2VzL2Jsb2cvMjAyMjEyLzA2MDgyOTM2XzYzOGU4Y2YwZDE0NmI3OTk4OC5wbmc%3D.png?w=700&webp=1)
此时在使用聚合函数统计
db.test3.aggregate(
[{
"$match": {
"content.targetCode":'patExam'
}
},
{
"$group": {
"_id": null,
"Total": {
"$sum": "$content.result"
}
}
}
])
![mongodb3.4字符类型的字段求和 mongodb3.4字符类型的字段求和](https://image.shishitao.com:8440/aHR0cHM6Ly9zMi41MWN0by5jb20vaW1hZ2VzL2Jsb2cvMjAyMjEyLzA2MDgzMDEwXzYzOGU4ZDEyN2RhZGMzMjA1MC5wbmc%3D.png?w=700&webp=1)