在mongo中对字符类型数据求和时结果不是想要的,需要将字符类型数据转换为数字后再进行统计
集合中字段同时包含字符型数字和Number类型
mongo 聚合语句
[{
"$project": {
"size": 1,
"fsize": {
"$convert": {
"input": "$size",
"to": "long",
"onError": 0,
"onNull": 0
}
}
}
},
{
"$group": {
"_id": null,
"num": {
"$sum": "$fsize"
}
}
}]
java 代码
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.project("size").and(
//这里将size类型转换为long类型,并指定转换失败或字段没有值时返回的值
ConvertOperators.Convert.convertValueOf("size").to("long").onErrorReturn(0L).onNullReturn(0L)
).as("fsize"), //别名
Aggregation.group().sum("fsize").as("num"),
Aggregation.addFields().addFieldWithValue("type", "7")
.addField("fondsId").withValue("1")
.addField("dataGroup").withValue("总和").build()
);
System.out.println(aggregation);
AggregationResults<StatisticLog> aggregate = mongoTemplate.aggregate(aggregation, "collectionName", Statistic.class);
对字符串类型中的数字部分求和
Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("field").is("fieldValue")),//条件筛选
//根据日期进行统计,日期为字符串数据,需特殊处理,这里是根据月份进行分组统计,截取日期字符串0-7为月份
Aggregation.project("date").andExpression(date).substring(0, 7).as("times")
//对该字段的数据转换为doubbo进行统计
.and(ConvertOperators.Convert.convertValueOf("size").to("int").onErrorReturn(0).onNullReturn(0)).as("num"),
//根据处理后的时间进行分组,对处理后的要统计的字段数据进行求和
Aggregation.group("times").sum("num").as("countSum"),
//从新挑选展示字段
Aggregation.project("times", "countSum").and("times").previousOperation());
AggregationResults<Statistic> result = mongoTemplate.aggregate(aggregation, tableName, Statistic.class);
List<Statistic> results = result.getMappedResults();
标签:字符,Mongo,求和,fsize,aggregation,Aggregation,num,times,size
From: https://www.cnblogs.com/dreamsrj/p/17607595.html