Mongo 中字符类型数字求和
在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();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义