因未接触MongoDB数据库,而项目中使用MongoDB做数据库, 且选择Spring整合的MongoTemplate,在使用过程遇到一些问题,故记录一下相关的使用

参考资料:

https://docs.spring.io/spring-data/mongodb/docs/2.1.5.RELEASE/api/

https://www.jianshu.com/p/a576499769ae

https://blog.csdn.net/biubiu2it/article/details/87898334

1 MongoTemplate使用

1 添加maven依赖
       <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-mongodb</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>
2 添加连接配置信息
  data:
    mongodb:
      # uri: mongodb://<username>:<password>@127.0.0.1:27017/test
      uri: mongodb://@127.0.0.1:27017/test
3 实体类
@Data
@Document("student")
public class Student {
    private String id;
    private String username;
    private String password;
    private Date birthday;
    private Date crtTime;
}
4 MongoTemplate的操作

常用方法:

        // 1 新增
        mongoTemplate.insert(Student.class);
        mongoTemplate.save(Student.class);
        mongoTemplate.insertAll(new ArrayList<Student>());

        // 2 修改
        mongoTemplate.update(Student.class);
        mongoTemplate.updateFirst(new Query(), new Update(), Student.class);

        // 3 删除
        mongoTemplate.remove(Student.class);
        mongoTemplate.remove(new Query(), Student.class);
        mongoTemplate.findAndRemove(new Query(), Student.class);

        // 4 查询
        mongoTemplate.find(new Query(), Student.class);
        mongoTemplate.findById("id", Student.class);
        mongoTemplate.findAll(Student.class);

        // 5 统计
        mongoTemplate.count(new Query(),Student.class);

说明:

  • 1 Query对象是一个查询对象,用来封装给所有的条件对象;再创建一个criteria对象,用来封装所有的查询条件(类似通用mapper中的功能)

  • 2 精确查询 criteria.and(“属性名”).is(“值”);
    模糊条件 criteria.and(“属性名”).regex(“值”)

  • 3 封装条件 query.addCriteria(criteria)

  • 4 创建Criteria对象方法

    • 1 直接new对象 Criteria criteria = new Criteria();
    • 2 通过Criteria.where()静态方法创建 Criteria.where(“属性名”).is(“值”)
  • 5 query对象可以添加多个criteria对象 ,且一个query中只能**有一个andOperator()或OrOperator()**操作.

    Query.addCriteria(new Criteria().andOperator(条件一,条件二));

  • 6 排序

        // 排序规则
            // 1 多个排序规则相同时, 可依次添加字段; 不同排序规则,需要在后续添加
            query.with(new Sort(Sort.Direction.ASC, "id").and(new Sort(Sort.Direction.ASC, "name")));
    
            // 2 静态方法,定义多个排序器,每个排序只能添加一个字段
            query.with(Sort.by(
                    Sort.Order.asc("id"),
                    Sort.Order.desc("name")
            ));
    
5 业务处理类
@Service
@Slf4j
public class ConsumerService {
public void demo() {
        // 1 查询全部
        List<Student> students = mongoTemplate.findAll(Student.class);
        System.out.println(students);

        // 2 根据id查询
        Student student = mongoTemplate.findById("12", Student.class);
        System.out.println(student);

        // 3 准确查询
        Query query = new Query(Criteria
                .where("username").is(student.getUsername())
                .and("password").gt(student.getPassword());
        List<Student> students1 = mongoTemplate.find(query, Student.class);
        System.out.println(students1);

        // 4 模糊查询
        Query query1 = new Query(Criteria.where("username").regex("李白"));
        List<Student> students2 = mongoTemplate.find(query1, Student.class);
        System.out.println(students2);

        // 5 分页查询
        int totalCount = (int) mongoTemplate.count(query, Student.class);
        int pageNum = 4;
        int pageSize = 10;
        List<Student> studentList = mongoTemplate.find(query.skip((pageNum - 1) * pageSize).limit(pageSize), Student.class);
        System.out.println(studentList);

        // 6 修改
        Student student1 = new Student();
        Query query2 = new Query(Criteria.where("_id").is(student1.getId()));
        Update update = new Update();
        update.set("username", student1.getUsername());
        mongoTemplate.upsert(query2, update, Student.class);

        // 7 删除
        String id = "1111";
        Query query3 = new Query(Criteria.where("_id").is(id));
        mongoTemplate.remove(query3, Student.class);

        // 8 新增
        Student student2 = new Student();
        mongoTemplate.insert(student2);
                                
        // 9 复杂查询 
        // 查询用户名为李白的或如果用户名不存在,创建日期为现在的数据
        // 排序规则是: 用户名升序排  创建时间降序排
        Query query4 = new Query();
        query4.addCriteria(new Criteria().orOperator(Criteria.where("username").is("李白"),
                Criteria.where("username").is(null).and("ctrTime").is(new Date())
                )
        );
        query4.with(Sort.by(
                Sort.Order.asc("username"),
                Sort.Order.desc("ctrTime")
        ));
        List<Student> students3 = mongoTemplate.find(query4, Student.class);
        System.out.println(students3);                         
    }
}                               
6 总结

在使用过程中, MongoTemplate的基础功能很容易上手, 但是涉及到多条件查询,涉及复杂的业务就很容易错误,需要细心检查,此外对于排序的使用也需要注意,很容易写错,导致多个排序条件被覆盖没有生效.

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐