美文网首页
springboot整合mongodb复杂查询和分页查询

springboot整合mongodb复杂查询和分页查询

作者: 潇豪 | 来源:发表于2020-07-10 16:51 被阅读0次

    添加依赖

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    

    配置文件

    #端口
    server.port=8888
    ##mongo主机地址
    spring.data.mongodb.host=127.0.0.1
    ##端口号
    spring.data.mongodb.port=27017
    #数据库名称
    spring.data.mongodb.database=test
    

    创建两个实体类测试

    @Data
    @Document(collection = "student")
    public class Student {
    
        private String id;
        private String name;
        private String unicode;
    }
    
    @Data
    @Document(collection = "teacher")
    public class Teacher {
    
        private String id;
        private String name;
        private String project;
        private List<Student> students;
    }
    

    为了方便test类中测试

    
    @SpringBootTest
    class MongodbApplicationTests {
    
        @Resource
        private MongoTemplate mongoTemplate;
        @Resource
        private MongoUtil mongoUtil;
    
        @Test
        void addStudent() {
            int a = 1;
            while (a <= 100) {
                Student student = new Student();
                student.setName("name" + a);
                student.setUnicode(UUID.randomUUID().toString());
                Student insert = mongoTemplate.insert(student);
                System.out.println(insert);
                a++;
            }
        }
    
    
        @Test
        void findByName() {
            Query query = new Query(Criteria.where("name").is("name1"));
            List<Student> students = mongoTemplate.find(query, Student.class);
            System.out.println(students);
        }
    
        @Test
        void findByNameAndUnicode() {
    //        Query query = new Query(Criteria.where("name").is("name1").and("unicode").is("e24928f8-ef7a-479d-8211-fb4e01c344f5"));
            Student student = new Student();
            student.setName("name1");
            student.setUnicode("e24928f8-ef7a-479d-8211-fb4e01c344f5");
            Query query = new Query(Criteria.byExample(student));
            List<Student> students = mongoTemplate.find(query, Student.class);
            System.out.println(students);
        }
    
        @Test
        void addTeacher() {
            List<String> str = new ArrayList<>();
            str.add("name1");
            str.add("name2");
            Query query = new Query(Criteria.where("name").in(str));
            List<Student> students = mongoTemplate.find(query, Student.class);
            int a = 1;
            while (a < 100) {
                Teacher teacher = new Teacher();
                teacher.setName("teacher");
                teacher.setProject("project" + a);
                teacher.setStudents(students);
                Teacher insert = mongoTemplate.insert(teacher);
                a++;
            }
        }
    
        /**
         * 查询list中对象的值
         */
        @Test
        void findTeacher() {
            Query query = new Query(Criteria.where("students.name").is("name1").and("project").is("project1"));
            List<Teacher> teachers = mongoTemplate.find(query, Teacher.class);
            System.out.println(teachers);
        }
    
        /**
         * 分页查询
         */
        @Test
        void findByPage() {
    //        Query query = new Query(Criteria.where("students.name").is("name1").and("project").is("project1"));
            Query query = new Query(new Criteria());
    //        query.with(Sort.by(Sort.Direction.DESC, "time"));
            mongoUtil.start(2, 2, query);
            List<Teacher> teachers = mongoTemplate.find(query, Teacher.class);
            long count = mongoTemplate.count(query, Teacher.class);
            PageHelper pageHelper = mongoUtil.pageHelper(count, teachers);
            System.out.println(pageHelper);
        }
    
        /**
         * 更新操作
         */
        @Test
        void update() {
            Query query = new Query();
            query.addCriteria(Criteria.where("project").is("project2"));
            Update update = new Update();
    //        //直接更新
    //        update.set("students", "更新成功");
    //        //文档不存在的话会插入一条新的记录
    //        update.setOnInsert("students", "更新成功1");
    //        //移除这个键
    //        update.unset("students");
            //加入到一个集合中,不会重复
    //        update.addToSet("students", "更新成功3");
            //需要传值,会清空其他属性
    //        update.addToSet("students");
            UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Teacher.class);
            System.out.println(updateResult);
        }
    }
    
    

    自己封装工具类用于分页

    /**
     * @author shawn
     */
    @Data
    public class PageHelper<T> {
        private long currentPage;
        private long total;
        private long pageSize;
        private List<T> list;
    
        public PageHelper(long pageNum, long total, long pageSize, List<T> list) {
            this.currentPage = pageNum;
            this.total = total;
            this.pageSize = pageSize;
            this.list = list;
        }
    
        public PageHelper(long pageNum, long pageSize, List<T> list) {
            this.currentPage = pageNum;
            this.pageSize = pageSize;
            this.list = list;
        }
    }
    

    工具类

    package com.example.mongodb.util;
    
    import lombok.Data;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.stereotype.Component;
    
    import java.util.List;
    import java.util.regex.Pattern;
    
    /**
     * @author shawn
     */
    @Data
    @Component
    public class MongoUtil<T> {
        public Integer pageSize;
        private Integer currentPage;
    
    
        public void start(Integer currentPage, Integer pageSize, Query query) {
            pageSize = pageSize == 0 ? 10 : pageSize;
            query.limit(pageSize);
            query.skip((currentPage - 1) * pageSize);
            this.pageSize = pageSize;
            this.currentPage = currentPage;
        }
    
        public PageHelper pageHelper(long total, List<T> list) {
            return new PageHelper(this.currentPage, total, this.pageSize, list);
        }
    
        public PageHelper pageHelper(List<T> list) {
            return new PageHelper(this.currentPage, this.pageSize, list);
        }
    
        public PageHelper pageHelper(long currentPage, long total, long pageSize, List<T> list) {
            return new PageHelper(currentPage, total, pageSize, list);
        }
    
        public PageHelper pageHelper(long currentPage, long pageSize, List<T> list) {
            return new PageHelper(currentPage, pageSize, list);
        }
    
    
        /**
         * 用于模糊查询忽略大小写
         *
         * @param string
         * @return
         */
        public Pattern getPattern(String string) {
            Pattern pattern = Pattern.compile("^.*" + string + ".*$", Pattern.CASE_INSENSITIVE);
            return pattern;
        }
    }
    
    

    批量插入

    需要用到BulkOperations,参考官方文档
    https://docs.mongodb.com/manual/core/bulk-write-operations/

    批量插入示例如下:
    List<Object> insertDataList;
    BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, collectionName);
    operations.insert(insertDataList);
    BulkWriteResult result = operations.execute();
    
    批量修改示例如下:
    List<Object> updateDataList;
    BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, collectionName);
    updateDateList.forEach(date -> {
       Query queryUpdate = new Query();
       queryUpdate.addCriteria(where("_id").is(value));
       Update update = new Update();
       update.set(field1, value1).set(field2, value2);
       operations.updateOne(queryUpdate, update);
    });
    BulkWriteResult result = operations.execute();
    
    利用BulkOperations的upsert方法可以同时支持插入和更新操作,示例如下:
    List<T> dataList = new ArrayList<>();
    List<Pair<Query, Update>> updateList = new ArrayList<>(dataList.size());
    BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, collectionName);
    dataList.forEach(data -> {
     Query query = new Query(new 
     Criteria(field1).is(value1)).addCriteria(new Criteria(field2).is(value2));
     Update update = new Update();
     for (int index = 0; index < dataList.size(); index++) {
        String key = data.getKey();
        String value = data.getValue();
       update.set(key, value);
     }
     Pair<Query, Update> updatePair = Pair.of(query, update);
     updateList.add(updatePair);
    });
    operations.upsert(updateList);
    BulkWriteResult result = operations.execute();
    

    备注:BulkOperations.BulkMode.UNORDERED 和 BulkOperations.BulkMode.ORDERED的区别:
    UNORDERED是平行处理,即使某条记录出错了,其余的也会继续处理;

    ORDERED是队列排序处理,只要中途有个失败了,那么后续的操作流程就会终止了。

    enum BulkMode {
    
       /** Perform bulk operations in sequence. The first error will cancel processing. */
       ORDERED,
    
       /** Perform bulk operations in parallel. Processing will continue on errors. */
       UNORDERED
    };
    

    相关文章

      网友评论

          本文标题:springboot整合mongodb复杂查询和分页查询

          本文链接:https://www.haomeiwen.com/subject/gommcktx.html