一,SpringBoot整合MongoDB准备工作
首先要有mongodb的Document对应的实体类,标注@Document注解(collection="zt_message_carousel"即为mongodb库中的文档名字,不添加这个注解后面的数据库名,无法对数据进行操作)
@Document(collection="zt_message_carousel")
public class CarouselInfo {
//创建索引
@Indexed(unique = true)
@Id
private String id;
private String type;
private String title;
private String clickUrl;
private String photoUrl;
private Integer platformId;
private String systemId;
private Integer sort;
private int state;
private String creator;
private Date createTime;
private Date updateTime;
}
二,增加
//创建对象
CarouselInfo info = new CarouselInfo();
//设置参数
info.setId(UUIDUtil.getUuid());
info.setSystemId(params.getSystemId());
info.setPlatformId(params.getPlatformId());
info.setTitle(params.getTitle());
info.setType(params.getType());
info.setClickUrl(params.getClickUrl());
info.setCreator(params.getCreator());
info.setPhotoUrl(params.getPhotoUrl());
info.setCreateTime(new Date());
//调用方法,完成添加,并返回添加成功的数据
CarouselInfo carouselInfo = mongoTemplate.save(info);
insert: 若新增数据的主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException
异常提示主键重复,不保存当前数据。
save: 若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作。
三,删除(根据删除指定id对应的数据。)
import org.springframework.data.mongodb.core.query.Query;(Query的包路径)
// 创建查询
Query query = new Query();
Criteria criteria = new Criteria();
// 设置条件:
criteria.and("id").is(id);
//将条件添加到查询内
query.addCriteria(criteria);
// 调用remove(),进行删除,UserCollection.class是操作类
mongoTemplate.remove(query,UserCollection.class);
全表删除:如果删除一个表中全部数据可以这样:
public void dropCollection(String collectionName) {
// 计算表中数据的条数并删除
// 查询表数据条数
Query query = new Query();
List<NationalPostPlatformUserVO> all = mongoTemplate.findAll(NationalPostPlatformUserVO.class);
long count = all.size();
if (count > 0) {
// 删除后,就留下表明。字段和值都删除
mongoTemplate.remove(query, NationalPostPlatformUserVO.class);
}
}
四,修改
//创建查询
Query query = new Query();
Criteria criteria = new Criteria();
// 设置查询条件
criteria.and("systemId").is(params.getSystemId()).and("platformId").is(params.getPlatformId()).and("id").is(params.getId());
query.addCriteria(criteria);
//创建Update,修改字段 例如把title修改为params.getTitle()
Update update = new Update().set("title", params.getTitle()).set("type", params.getType()).set("photoUrl", params.getPhotoUrl()).set("updateTime",new Date());
//执行修改操作,返回修改成功的条数
UpdateResult res = mongoTemplate.updateFirst(query, update, CarouselInfo.class);
updateFirst和updateMulti区别:
五,查询(根据id查询版本信息)
mongoTemplate.find查询多条 findOne 查询一条
Query query = new Query();
Criteria criteria = new Criteria();
criteria.and("id").is(id);
query.addCriteria(criteria);
AppPackageVersionInfo appPackageVersionInfo = mongoTemplate.findOne(query, AppPackageVersionInfo.class);
时间查询:(因为criteria的条件只能添加一次,所以用三个if)
if (StringUtils.isNotBlank(sendStartDate) && StringUtil.isBlank(sendEndDate)) {
criteria.and("pubTime").gte(DateUtil.getDate(sendStartDate, "yyyy-MM-dd"));
}
if (StringUtils.isNotBlank(sendEndDate) && StringUtil.isBlank(sendStartDate)) {
criteria.and("pubTime").lte(DateUtil.getDate(sendEndDate, "yyyy-MM-dd"));
}
if (StringUtil.isNotBlank(sendStartDate) && StringUtil.isNotBlank(sendEndDate)) {
criteria.and("pubTime").gte(DateUtil.getDate(sendStartDate, "yyyy-MM-dd")).lte(DateUtil.getDate(sendEndDate, "yyyy-MM-dd"));
}
// 查询表数据条数
List<NationalPostPlatformUserVO> all = mongoTemplate.findAll(NationalPostPlatformUserVO.class);
long count = (long) all.size();
六,SpringBoot整合MongoDB完成分页查询操作
public List<GetPointLogVo> getPointLogList(PageParameter pageParameter , String platformId) {
Query query = new Query();
Criteria criteria = new Criteria();
if (StringUtils.isNotBlank(platformId)) {
criteria.and("platformId").is(platformId);
}
// 查询总数
query.addCriteria(criteria);
long count = mongoTemplate.count(query, GetPointLogVo.class);
if (count <= 0) {
pageParameter.setTotalCount(0);
return new ArrayList<>();
}
// 按getPointDate进行降序排序并分页查询
query.with(Sort.by(Sort.Order.desc("getPointDate")))
.skip((long)(pageParameter.getCurrentPage() - 1) * pageParameter.getPageSize())
.limit(pageParameter.getPageSize());
List<GetPointLogVo> getPointLogVos = mongoTemplate.find(query, GetPointLogVo.class);
pageParameter.setTotalCount((int)count);
return getPointLogVos;
}
通过测试用例解析:
@Test
void getPointLogList() {
PageParameter pageParameter = new PageParameter();
// 每页大小
pageParameter.setPageSize(2);
// 当前页
pageParameter.setCurrentPage(2);
List<GetPointLogVo> pointLogList = getPointLogService.getPointLogList(pageParameter,"15",);
assertEquals(1, pointLogList.size());
}
当不给PageSize赋值时,查出来的是全部数据。10条。
其中索引为0,1,2,3的数据如下:
当给PageSize赋值为2时,查出来的是2条。(PageSize是每页大小,这两条数据就会显示到界面上)
数据对应着索引0,1.
当设置当前页CurrentPage为2,PageSize为2时,就会跳过这一页开始查询对应代码:skip((pageParameter.getCurrentPage() - 1) * pageParameter.getPageSize())
显示的是索引2,3的数据:
七、criteria使用
criteria可以用and连接条件也可以用where连接条件:
criteria.and("systemId").is(params.getSystemId()).and("platformId").is(params.getPlatformId()).and("id").is(params.getId());
Criteria.where("createTime").gte(dateToISODate(new Date(beginTime +))).lte(dateToISODate(new Date(endTime)))
Criteria | Mongodb | 说明 |
and() | $and | 并且 |
andOperator() | $and | 并且 |
orOperator() | $or | 或者 |
gt() | $gt | 大于 |
gte() | $gte | 大于等于 |
in() | $in | 是否被包含在数组或者list内 |
is() | $is | 等于 |
regex() | $regex | 正则表达式用于模式匹配,基本上是用于文档中的发现字符串 (下面有例子) |
lt() | $lt | 小于 |
lte() | $lte | 小于等于 |
nin | $nin | 不包含 |
set $set 给字段赋值。字段不存在,增加字段并赋值
regex():
数据库内容:您投递的11111111111已通过初步筛选,请尽快通过https://xxx.xxx.com//进行考试报名 String title = "11111111111已通过初步筛选,请尽快通过https://xxx.xxx.com//进行考试报名"; // 判断 riteria.and(数据库内容).包含(title); riteria.and("title").regex(title); 结果是包含
还有一个equal()和is()不一样,不知道什么用处。
八、排序:
// 升序
query.with(Sort.by(Sort.Order.asc("build")));
// 降序
query.with(Sort.by(Sort.Order.desc("build")))
九、指定字段去重:findDistinct()
1.参数说明:
- query查询条件
- 需要去重的字段filed
- 查询的表的类名
- 返回结果类(具体看下面几种例子:)
当写实体类时,返回的是第二个参数的类型:
当写实体类中不存在的类型时,报错:
当写实体类中随意一个类型时,查询到的certificateYear(也就是第二个参数),返回的就是他的Double类型。
public Map<String, Object> getUserCertificatePrintDateStr(String userId, String trainplanId, String platformId, Boolean ifCertificateYearPrint) {
Query query = new Query();
Criteria criteria = new Criteria();
criteria.and("userId").is(userId).and("trainplanId").is(trainplanId).and("platformId").is(platformId);
List<String> dataList = new ArrayList<>(10);
query.addCriteria(criteria);
if (ifCertificateYearPrint) {
// 展示出每种certificateYear,去重查询
dataList = mongoTemplate.findDistinct(query, "certificateYear", UserCertificatePrintRecordVo.class,
String.class);
} else {
dataList = mongoTemplate.findDistinct(query, "printDateStr", UserCertificatePrintRecordVo.class,
String.class);
}
Map<String, Object> dataMap = setUserCertificateTotalClassHours(dataList);
return dataMap;
}
2.举例二
public int getUserVisitCountData(Date studyStartDate, Date studyEndDate, String platformId) {
Query query = new Query();
Criteria criteria = new Criteria();
if (studyStartDate != null && studyEndDate == null ) {
criteria.and("getPointDate").gte(studyStartDate);
}
if (studyEndDate != null && studyStartDate == null) {
criteria.and("getPointDate").lte(studyEndDate);
}
if (studyStartDate != null && studyEndDate != null) {
criteria.and("getPointDate").gte(studyStartDate).
lte(studyEndDate);
}
criteria.and("platformId").is(platformId);
query.addCriteria(criteria);
// 普通查询
List<GetPointLogVo> getPointLogVos1 = mongoTemplate.find(query, GetPointLogVo.class);
// 去重查询
List<GetPointLogVo> getPointLogVos = mongoTemplate.findDistinct(query ,"userId", GetPointLogVo.class,GetPointLogVo.class);
return getPointLogVos.size();
}
指定字段为“userId”,查询结果会通过userId进行去重
普通查询数量为975,结果为:
去重查询,数量为98: 结果为: