MongoTemplate的使用(学习笔记)

1.引入maven依赖

<dependency>
	<groupId>org.mongodb</groupId>
	<artifactId>mongo-java-driver</artifactId>
	<version>3.6.4</version>
</dependency>
<dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-mongodb</artifactId>
      <version>1.9.2.RELEASE</version>
</dependency>

2.配置application.yml

spring:
  data:
    mongodb:
       uri: mongodb://<username>:<password>@192.168.0.111:27017/mongodb

3.实体类

常用注解:

@Document
使用@Document(org.springframework.data.mongodb.core.mapping.Document)标注Java的类名对应的MongoDB的集合名称。

@Id、@MongoId
使用@Id(org.springframework.data.annotation.Id)或@MongoId(低版本依赖可能需升级才有)映射MongoDB的_id字段,若没有使用这两个注解,则字段中名称为id的字段将自动映射到_id上。使用这两个注解可标注的字段类型为String、ObjectId(org.bson.types.ObjectId)。

@Indexed
声明该字段需要索引,建索引可以大大的提高查询效率。

@Field
使用@Field(org.springframework.data.mongodb.core.mapping.Field)字段,将Java类中字段名称与MongoDB集合中字段名称不一致的字段映射成一致的。如Java中使用了驼峰命名的startTs字段,想要映射成MongoDB中的start_ts字段就可以使用@Field完成。

@Transient
使用@Transient(org.springframework.data.annotation.Transient)标注该字段不持久化至数据库中。

@DBRef
声明类似于关系数据库的关联关系。ps:暂不支持级联的保存功能,当你在本实例中修改了DERef对象里面的值时,单独保存本实例并不能保存DERef引用的对象,它要另外保存。

举个栗子:

@Data
@Document("test_dto")
public class TestDto {

    @Id
    private String id;
//    @MongoId
//    private String id;

    @Indexed
    private Integer status;

    @Field("create_ts")
    private Long createTs;

    @Transient
    private String ignoreProperty;

    @DBRef
    private List<ThirdParty> thirdParties;

}

4.MongoTemplate的操作

4.1.常用方法

:insert和save。两者区别如下:

插入重复数据时:insert报DuplicateKeyException提示主键重复;save对已存在的数据进行更新。
批处理操作时:insert可以一次性插入整个数据,效率较高;save需遍历整个数据,一次插入或更新,效率较低。

可使用映射对象或Query对象,使用remove进行删除。

find查询集合,findOne查询一个。

updateFirst更新一个,update更新所有符合条件的。

        // 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);

4.2.查询条件

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

  • 创建Query对象
    Query query = new Query(criteria);
  • 创建Criteria对象方法
    1. 直接new对象 Criteria criteria = new Criteria();

    2. 通过Criteria.where()静态方法创建 Criteria.where(“属性名”).is(“值”)(criteria.and().is()与criteria.where().is()都可以进行查询,但两种方式不能混合使用,否则不生效。)

    3. 精确查询 criteria.and(“属性名”).is(“值”);

    4. 模糊条件 criteria.and(“属性名”).regex(“值”)

      Pattern pattern=Pattern.compile("^.*"+taskTypeCode+".*$", Pattern.CASE_INSENSITIVE);
      
      criteria.and("taskTypeCode").regex(pattern);
      
    5. 范围查询,根据日期时间进行范围查询(其中gt为大于,lte为小等于);

      SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
      
      criteria.and("createTime").gt(format.parse(createTime));
      
      criteria.and("endTime").lte(format.parse(endTime));
      
    6. or查询,在MongoTemplate 中 or 是用 orOperator表示的;

      new Criteria().and("orderId").is(item.getOrderId())
              .orOperator(
                      Criteria.where("status").is(1),
                      Criteria.where("status").is(null)
              );
      
    7. 将查询条件装载到query中

      query.addCriteria(criteria);
      
    8. 排序 通过参数 direction 判断排序方向,sortField 为排序字段

      query.with(new Sort(direction, sortField));
      
    9. 分页,有两种方式,一种是通过pageable 一种是 limit().skip();limit表示查询多少数据,skip表示从哪条数据查起

      //第一种
      
      Pageable pageable = new PageRequest(page, size, new Sort(new Sort.Order(direction, sortField)));
      
      query.with(pageable);
      
      long totoal = this.mongoTemplate.count(query, TaskMongo.class);
      
      List<TaskMongo> listTaskMongo = this.mongoTemplate.find(query , TaskMongo.class);
      
      //第二种
      
      query.limit(5000).skip(5000);
      
      List<TaskMongo> listTaskMongo = this.mongoTemplate.find(query , TaskMongo.class);
      
posted @ 2022-06-28 14:10  B1nbin  阅读(2288)  评论(1编辑  收藏  举报
/*
*/