1.需求,表A中按一定条件,根据a字段统计b、c两字段的总和——sql语句实现,实测好使
db.getCollection("A").aggregate([ { "$match":{ "d":0} },{ "$group":{ "_id":"$a", "total":{ $sum:{$add:["$b","$b"]} } } } ])
另外,如果不是根据某个字段统计,而是要分组统计所有数据,那么group里的"_id"对应的值改成null或者常量即可
2.java代码实现,使用springboot的mongoTemplate里的aggregate方法,这次主要说一下用java代码如何实现sum中套add的方法,需要借助ArithmeticOperators中的静态内部类Add,上代码
List<AggregationOperation> operations = new ArrayList<>(); operations.add(Aggregation.match(criteria));//匹配条件 operations.add(Aggregation.group("a").sum(//group里不加任何东西,表示整个表分组统计 ArithmeticOperators.Add.valueOf("b").add("c"))//这个表示两个字段先add,在sum,特别牛 .as("total")); Aggregation aggregation = Aggregation.newAggregation(operations); AggregationResults<BasicDBObject> aggregateResult = mongoTemplate.aggregate(aggregation,A, BasicDBObject.class); List<BasicDBObject> results = aggregateResult.getMappedResults();
查看输入日志:
[{ "$match" : {}}}}, { "$group" : { "_id" : "$a","totalUnDone" : { "$sum" : { "$add" : ["$b", "$c"]}}}}] in collection A
总结:mongoTemplate里有很多可以挖掘的东西,这个ArithmeticOperators的内部变量也是翻源码找的, 需要同志们一起努力,加油!!!
如果帮到了您,需要大家写个好评