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的內部變量也是翻源碼找的, 需要同志們一起努力,加油!!!
如果幫到了您,需要大家寫個好評