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对象方法
-
直接new对象 Criteria criteria = new Criteria();
-
通过Criteria.where()静态方法创建 Criteria.where(“属性名”).is(“值”)(criteria.and().is()与criteria.where().is()都可以进行查询,但两种方式不能混合使用,否则不生效。)
-
精确查询 criteria.and(“属性名”).is(“值”);
-
模糊条件 criteria.and(“属性名”).regex(“值”)
Pattern pattern=Pattern.compile("^.*"+taskTypeCode+".*$", Pattern.CASE_INSENSITIVE); criteria.and("taskTypeCode").regex(pattern);
-
范围查询,根据日期时间进行范围查询(其中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));
-
or查询,在MongoTemplate 中 or 是用 orOperator表示的;
new Criteria().and("orderId").is(item.getOrderId()) .orOperator( Criteria.where("status").is(1), Criteria.where("status").is(null) );
-
将查询条件装载到query中
query.addCriteria(criteria);
-
排序 通过参数 direction 判断排序方向,sortField 为排序字段
query.with(new Sort(direction, sortField));
-
分页,有两种方式,一种是通过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);
-