栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mongo查询、聚合、索引

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mongo查询、聚合、索引

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;
    }

}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/677918.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号