MongoTemplate增删改查,分页查询,去重查询,全表删除

一,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)))
CriteriaMongodb说明
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.参数说明:

  1. query查询条件
  2. 需要去重的字段filed
  3. 查询的表的类名
  4. 返回结果类(具体看下面几种例子:)

当写实体类时,返回的是第二个参数的类型:

 当写实体类中不存在的类型时,报错:

当写实体类中随意一个类型时,查询到的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: 结果为:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值