Mongo 中字符类型数字求和

发布时间 2023-08-05 10:42:00作者: Dreamsrj

在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();