springboot 和mongo 聚合多个参数及分页排序和创建索引
我们在使用mongodb有时候需要 group by 参数1,参数2,并在分组中进行排序分页操作。这里我将这种例子展示出来,大家可以作为参考。如果需要查看mongo和springboot结合的配置可以参考,下面这两篇文章。
https://blog..net/fajing_feiyue/article/details/103330764
https://blog..net/fajing_feiyue/article/details/103110616
下面的代码主要展示,mongo在多次goup by的应用。
@Override public JsonVO testMongoFind2() { //效果等同于 //select sum(valueInt) as sumNum,count(1) as countNum, count(distinct valueStr2) as distNum,valueStr from table where valueInt>=0 group by valueStr order by countNum Sort sort = Sort.by(Sort.Direction.ASC, "countNum"); Criteria criteria = Criteria.where("valueInt").gte(0); Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria), //由于需要distinct valuesStr2 ,故第一次group by valueStr,valuesStr2 Aggregation.group("valueStr","valueStr2").count().as("countNum"). sum("valueInt").as("sumNum"), //将上一步获取到数 ,作为下一步使用到的参数 Aggregation.project("countNum").and("sumNum").as("sumNum").and("valueStr").as("valueStr"). and("valueStr2").as("valueStr2"), //再次group by valueStr(这个时候就相当于,通过第一次的goupby 对valuesStr2 进行去重操作),最后一次需要将first这样才会有值 Aggregation.group("valueStr").sum("sumNum").as("sumNum") .sum("countNum").as("countNum").count().as("distNum").first("valueStr").as("valueStr"), Aggregation.project("sumNum").and("countNum").as("countNum") .and("distNum").as("distNum").and("valueStr").as("valueStr"), Aggregation.sort(sort), Aggregation.skip(0L), Aggregation.limit(10)); AggregationResults<AggregationVO2> mongoTest = mongoTemplate.aggregate(aggregation, "mongoTest", AggregationVO2.class); List<AggregationVO2> mappedResults = mongoTest.getMappedResults(); System.out.println(mappedResults); JsonVO jsonVO = new JsonVO(200, "success"); jsonVO.setData(mappedResults); return jsonVO; }
这里附上展示的内容。
@Data public class AggregationVO2 { private Integer sumNum; private Integer countNum; private Integer distNum; private String valueStr; //private String valueStr2; }
这里是返回的结果
{ "statusCode": 200, "errorMessage": "success", "data": [ { "sumNum": 5, "countNum": 1, "distNum": 1, "valueStr": "" }, { "sumNum": 5, "countNum": 1, "distNum": 1, "valueStr": null }, { "sumNum": 16, "countNum": 2, "distNum": 1, "valueStr": "wohao" }, { "sumNum": 12, "countNum": 2, "distNum": 2, "valueStr": "nihao" } ] }
另外我们在使用mongodb的时候,有时候需要使用代码创建索引
public JsonVO createIndex(){ //new Document org.bson.Document document = new org.bson.Document(); document.put("valueInt", 1); document.put("time", -1); Index index = new CompoundIndexDefinition(document); index.named("test_index"); index.background(); mongoTemplate.indexOps("mongoTest").ensureIndex(index); JsonVO jsonVO = new JsonVO(200, "success"); return jsonVO; }
这里是查看索引和索引大小的两条命令
db.mongoTest.getIndexes() db.mongoTest.totalIndexSize()
可以看到索引已经创建成功。