springboot项目,新建一个controller引入@Autowired mongoTemplate即可开始测试代码。
# 配好SpringDataMongo的环境 spring.data.mongodb.host=localhost spring.data.mongodb.username=root spring.data.mongodb.password=1111 spring.data.mongodb.authentication-database=admin spring.data.mongodb.database=mongo-test spring.data.mongodb.port=27017
@Data
@document(collection = "student")
public class StudentDO {
@Id
private String id;
private String name;
private Integer clazz;
private Integer mark1;
private Integer mark2;
private Integer mark3;
private String info;
}
一个Controller类,几个接口,覆盖了几种mongo的聚合操作,如果有更多的可以操作的,我会增加更多示例代码。
@Slf4j
@RestController
@RequestMapping("/mongoAgg")
public class MongoAggController {
@Autowired
private MongoTemplate mongoTemplate;
@PostMapping("/create-students")
public void createStudents() {
// 删除旧的数据
mongoTemplate.dropCollection(StudentDO.class);
// 创建集合并且创建time字段的正序索引
BasicDBObject basicDBObject = new BasicDBObject();
basicDBObject.put("time", 1);
IndexModel indexModel = new IndexModel(basicDBObject);
mongoTemplate.createCollection(StudentDO.class).createIndexes(new ArrayList<>(Collections.singletonList(indexModel)));
// 循环生成student对象
String nameString = "qwertyuiopasdfghjklzxcvbnm";
// name char+char+char
// clazz from 1 to 6
// mark 50 to 100
for (int i = 0; i < 10000; i++) {
StudentDO studentDO = new StudentDO();
String name = "";
name += nameString.charAt(RandomUtils.rand(0, nameString.length() - 1));
name += nameString.charAt(RandomUtils.rand(0, nameString.length() - 1));
name += nameString.charAt(RandomUtils.rand(0, nameString.length() - 1));
studentDO.setName(name);
studentDO.setClazz(RandomUtils.rand(1,6));
studentDO.setMark1(RandomUtils.rand(50,100));
studentDO.setMark2(RandomUtils.rand(50,100));
studentDO.setMark3(RandomUtils.rand(50,100));
StringBuilder info = new StringBuilder();
int r = RandomUtils.rand(0, 10);
for (int j = 0; j < r; j++) {
info.append(RandomUtils.rand(1, 9));
}
studentDO.setInfo(info.toString());
studentDO.setTime(new Date(System.currentTimeMillis() + RandomUtils.rand(1, 999999)));
mongoTemplate.save(studentDO);
}
}
@GetMapping("/aggSumStudent")
public List aggSumStudent() {
GroupOperation groupOperation = Aggregation.group().count().as("总人数");
Aggregation aggregation = newAggregation(groupOperation);
AggregationResults results = mongoTemplate.aggregate(aggregation, "student", HashMap.class);
List mappedResults = results.getMappedResults();
System.out.println(mappedResults);
return mappedResults;
}
@GetMapping("/aggClassSumStudent")
public List aggClassSumStudent() {
GroupOperation groupOperation = Aggregation.group("clazz").count().as("总人数");
Aggregation aggregation = newAggregation(groupOperation);
AggregationResults results = mongoTemplate.aggregate(aggregation, "student", HashMap.class);
List mappedResults = results.getMappedResults();
System.out.println(mappedResults);
return mappedResults;
}
@GetMapping("/aggClassTwoEveryOneSumMark")
public List aggClassTwoEveryOneSumMark() {
MatchOperation matchOperation = Aggregation.match(new Criteria().and("clazz").is(2));
// 这两步Project算出每个符合条件的数据的mark123的总分
ProjectionOperation projectionOperation1 = project("mark1", "mark2", "mark3").and("mark1").plus("mark2").as("mark1");// 1 = 1+2的和
ProjectionOperation projectionOperation2 = project("mark1", "mark2", "mark3").and("mark1").plus("mark3").as("mark1");// 1 = 1+3的和
AggregationResults results = mongoTemplate.aggregate(newAggregation(matchOperation, projectionOperation1, projectionOperation2), "student", HashMap.class);
List mappedResults = results.getMappedResults();
System.out.println(mappedResults);
return mappedResults;
}
@GetMapping("/aggClassTwoMarkSumIs210To250")
public List aggClassTwoMarkSumIs210To250() {
MatchOperation matchOperation1 = Aggregation.match(new Criteria().and("clazz").is(2));
ProjectionOperation projectionOperation1 = project("mark1", "mark2", "mark3").and("mark1").plus("mark2").as("mark1");// 1 = 1+2的和
ProjectionOperation projectionOperation2 = project("mark1", "mark2", "mark3").and("mark1").plus("mark3").as("mark1");// 1 = 1+3的和
MatchOperation matchOperation2 = Aggregation.match(new Criteria().and("mark1").gte(210).lte(250));
GroupOperation groupOperation = Aggregation.group().count().as("总分在210-250的人数");
AggregationResults results = mongoTemplate.aggregate(newAggregation(matchOperation1, projectionOperation1, projectionOperation2, matchOperation2, groupOperation), "student", HashMap.class);
List mappedResults = results.getMappedResults();
System.out.println(mappedResults);
return mappedResults;
}
@GetMapping("/aggClassMarkAvg")
public List aggClassMarkAvg() {
GroupOperation groupOperation = Aggregation.group("clazz")
.avg("mark1").as("平均分1")
.avg("mark2").as("平均分2")
.avg("mark3").as("平均分3");
ProjectionOperation projectionOperation = project("平均分1","平均分2","平均分3").and("_id").as("班级").andExclude("_id");
AggregationResults results = mongoTemplate.aggregate(newAggregation(groupOperation, projectionOperation), "student", HashMap.class);
List mappedResults = results.getMappedResults();
System.out.println(mappedResults);
return mappedResults;
}
@GetMapping("/aggInfoDoubleOrder")
public List aggInfoDoubleOrder() {
ProjectionOperation projectionOperation = project().and("info").as("info").andexpression("strLenCP(info)").as("info_length");
SortOperation sortOperation = Aggregation.sort(Sort.Direction.ASC, "info_length", "info");
AggregationResults results = mongoTemplate.aggregate(newAggregation(projectionOperation,sortOperation), "student", HashMap.class);
List mappedResults = results.getMappedResults();
System.out.println(mappedResults);
return mappedResults;
}
}



