mongoTemplate的使用
1. 说明
在开发中遇到使用mongodb来进行查询和存储的功能需求,记性太差,记录下使用的方法。
项目结构:springboot 2.2.1release + gradle + spring-boot-starter-data-mongodb
QualityDataOutputDTO组成说明(因为这个类封装了很多层,封装的时候出现过封装不进去的问题):
@Getter
@Setter
@Document(collection = "db中collection的名字,对应实体类")
//这是第一层
public class QualityDataOutputDTO {
@Id//id
private String _id;
private Info info;
private Double time;
}
//这是第二层,属性里面还有封装了很多层,这里就没必要展示了
@Getter
@Setter
public class Info {
//之前就是在info属性里面没有加@Field注解指定字段,导致封装不进去,特别注意一下
@Field("ConfQos")
private ConfQos confQos;
@Field("ConfQoe")
private ConfQoe confQoe;
@Field("ConfAttr")
private ConfAttr confAttr;
@Field("timestamp")
private String timestamp;
}
2.1 查询(返回全部数据结构)
//创建查询条件criteria,where后面跟db字段名,is后面跟传入的值,进行精确查询相当于‘=’
//用and符号添加其他条件
Criteria criteria = Criteria.where("callId").is(callId). and("actorId").is(actorId);
Query query = new Query(criteria);
//用findOne方法,查询结果只返回一个,find方法返回一个list集合,把query和封装的实体类class对象添加进去
QualityDataOutputDTO qualityDataOutputDTO= mongoTemplate.findOne(query, QualityDataOutputDTO.class);
2.2 查询(只返回部分结果)
//query的另一种写法
Query query = Query.query(Criteria.where("info.ConfAttr.room_id").is(callIdStr));
// 只获取qoe部分,这个是重点fields().include("字段名")只包含这个字段
//另外我尝试了下include和exclude一起写,就报错了,提示两者只能存在一个,要么写包含的字段,要么写排除的字段
//返回的QualityDataOutputDTO中只有info.ConfQoe有值,其他属性为null
query.fields().include("info.ConfQoe");
List<QualityDataOutputDTO> list = mongoTemplate.find(query, QualityDataOutputDTO.class);
3.添加
//直接调用save方法,把实体类封装好添加进去,实体类中@Document(collection = "db中collection的名字,对应实体类")
mongoTemplate.save(meetingQualityEntity)
ps: 每天记录一点,进步一点! 写的不好,如果有问题欢迎大家一起讨论~