点击这里 > Java实现MongoDB分页查询以及优化方案设计

 @Transactionalpublic Result<PageResult<SubjectInfo>> list(SubjectInfoDTO subjectInfoDTO){Criteria criteria = new Criteria();// 模糊查询if (ObjectUtils.isNotEmpty(subjectInfoDTO.getTitle())) {criteria.and("title").regex(subjectInfoDTO.getTitle());}// Criteria支持二级嵌套查询if (ObjectUtils.isNotEmpty(subjectInfoDTO.getLabelId())) {criteria.and("labels.labelId").is(subjectInfoDTO.getLabelId());}if (ObjectUtils.isNotEmpty(subjectInfoDTO.getStyleId())) {criteria.and("styles.styleId").is(subjectInfoDTO.getStyleId());}// Criteria支持时间范围查询// 但注意只能有一个createTime字段作为查询条件if (ObjectUtils.isNotEmpty(subjectInfoDTO.getStartTime())&& ObjectUtils.isEmpty(subjectInfoDTO.getEndTime())) {criteria.and("createTime").gte(subjectInfoDTO.getStartTime());}if (ObjectUtils.isEmpty(subjectInfoDTO.getStartTime())&& ObjectUtils.isNotEmpty(subjectInfoDTO.getEndTime())) {criteria.and("createTime").lte(subjectInfoDTO.getEndTime());}if (ObjectUtils.isNotEmpty(subjectInfoDTO.getStartTime())&& ObjectUtils.isNotEmpty(subjectInfoDTO.getEndTime())) {criteria.and("createTime").gte(subjectInfoDTO.getStartTime()).lte(subjectInfoDTO.getEndTime());}// 设置排序Sort sort = Sort.by(Sort.Direction.ASC,"sort").and(Sort.by(Sort.Direction.DESC, "createTime"));Query query = new Query(criteria).with(sort);// 由于使用二级嵌套查询,所以这里不能直接使用mongoTemplate的count方法// mongoTemplate.count()算出总数为0int count = subjectInfoDao.list(query).size();// 分页条件SpringDataPageable pageable = new SpringDataPageable();pageable.setPageNumber(subjectInfoDTO.getPageNum());pageable.setPageSize(subjectInfoDTO.getPageSize());pageable.setSort(sort);List<SubjectInfo> list = subjectInfoDao.list(query.with(pageable));PageResult<SubjectInfo> pageResult = new PageResult<>();pageResult.setTotal(count);pageResult.setList(list);return new Result<PageResult<SubjectInfo>>().ok(pageResult);}

如何理解上面说到Criteria支持时间范围查询,但是只能有一个createTime字段作为查询条件?
以下是小编测试时首次写的代码:

 if (ObjectUtils.isNotEmpty(subjectInfoDTO.getStartTime())) {criteria.and("createTime").gte(subjectInfoDTO.getStartTime());}if (ObjectUtils.isNotEmpty(subjectInfoDTO.getEndTime())) {criteria.and("createTime").lte(subjectInfoDTO.getEndTime());}

假设如果两个查询条件都不为空,既选择了开始时间,又选择了结束时间
此时criteria语句就变成了
criteria.and(“createTime”).gte(subjectInfoDTO.getStartTime()).and(“createTime”).lte(subjectInfoDTO.getEndTime())
以MySql或Oracle的思维去写范围查询就是
Between A and B 相当于x > A and x < B
但是Mongo这里的criteria不支持这样的写法,只能有一个x,否则会报以下错误
org.springframework.data.mongodb.InvalidMongoDbApiUsageException: Due to limitations of the org.bson.Document, you can’t add a second ‘createTime’ expression specified as ‘createTime : Document{{KaTeX parse error: Expected ‘EOF’, got ‘}’ at position 33: …:00:00 CST 2021}̲}’. Criteria al…gte=Mon Sep 20 00:00:00 CST 2021}}’.

mongoTemplate结合Criteria实现分页、模糊、二级嵌套和时间范围查询等相关推荐

  1. php二级评论怎么实现,ThinkPHP视图模型实现二级嵌套评论的查询

    现正在编写一个学习网站项目用于参加全国中小学电脑制作活动,使用ThinkPHP框架 该项目要实现二级嵌套评论,pid为0的为一级评论,否则为二级评论,二级评论为一级评论的子评论. 最初设想是使用Thi ...

  2. mongotemplate mongodb的各种操作 模糊查询 精确查询 等等

    本意是想查查mongo数据库的int类型的like怎么查,但是好像没 解决这个问题. 一. 常用查询: 1. 查询一条数据:(多用于保存时判断db中是否已有当前数据,这里 is  精确匹配,模糊匹配 ...

  3. hibernate -- 分页模糊查询中setParameter 和setParameterList

    在分页模糊查询中碰到setParameter 和setParameterList这两个方法 setParameter 以前就只会用setParameter(int arg,String str),我用 ...

  4. Mongotemplate mongodb的各种操作 模糊查询 精确查询

    mongotemplate mongodb的各种操作 模糊查询 精确查询 - 门罗的魔术师 - 博客园

  5. php bootstrap 分页 查询,深入了解Bootstrap table表格插件(二)前后端分页模糊查询...

    这篇文章主要为大家分享了Bootstrap table学习笔记,前后端分页模糊查询,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在使用过程中,一边看文档一边做,遇到了一些困难的地方,在此记录一下 ...

  6. 5.6-5.8工作记录2—分页模糊查询

    5.6-5.8工作记录2-改造ssh 前言 作战过程 5.7项目上篇--分页模糊查询 jsp ssm PK ssh 准备ssm 对比ssh: 工作bug记录 注意 打怪 查询以及分页 知识点 准备第二 ...

  7. 新闻项目【分页模糊查询】

    今天要讲的是新闻页面的分页模糊查询.由上一个博客可知,新闻页面的分页:是先给页面绑定数据,再利用sql语句进行分页.而分页模糊查询就是再次基础上根据关键字查询相关数据.    String sql = ...

  8. 毕设IDEA2019之ssm多表分页模糊查询(PageHelper插件)

    PageHelper插件实现分页查询请戳这. 本篇在分页的基础上实现模糊查询,因为单表有点简单,直接介绍多表,输入关键字查找相关内容,之前几篇有点脱离毕设项目了,这篇开始尽量用项目做例子.没什么好说的 ...

  9. Mybatis-Plus——分页+模糊查询

    建表: create table pms_brand (brand_id bigint not null auto_increment comment '品牌id',name char(50) com ...

最新文章

  1. 曾因「抢车位」出圈儿,神奇的Mask R-CNN了解一下?
  2. Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network
  3. python之父去面试-Python面试题之Python的Super方法
  4. java 鼠标停留时,[Java教程]鼠标悬浮停留三秒 显示大图_星空网
  5. .net ajax式上传文件
  6. nssl1216-码灵鼠【数学】
  7. linux 怎么把^M去掉
  8. Linux中断(interrupt)子系统之四:驱动程序接口层 中断通用逻辑层
  9. [C++] - Returning by const value
  10. ife2015 深度克隆题目
  11. 创建和使用视图及异名
  12. unix系统中的挂载(mount)
  13. oracle alter system kill,ALTER SYSTEM KILL SESSION详解
  14. 财务自由的日子,我抑郁了
  15. JavaScript getDay()与getDate()
  16. Day 4 R基础概念——向量、矩阵
  17. 蓝桥杯2017国赛 瓷砖样式 dfs+map
  18. put请求带body
  19. Android开发必会技术!Flutter中网络图片加载和缓存源码分析,完整PDF
  20. Golang zap和lumberjack实现日志存储和自动管理

热门文章

  1. explore exploit
  2. 思维不要僵化在一种模式
  3. 带鱼饭+煮玉米+荷兰豆炒甜椒
  4. 社团招新如何吸引新人,制作一张好的海报最关键
  5. warning: TCG doesn‘t support requested feature: CPUID.01H:ECX.vmx [bit 5]Could not initialize SDL
  6. 申请百度文字识别APIkey和Secret Key+文字验证码识别案例
  7. 我的2016:做精彩的自己
  8. 10月14日科技资讯|华为折叠屏手机月底或开卖;苹果计划 3 年内推出 5G 基带芯片;Node.js 12.12.0 发布 | 极客头条
  9. 微信的服务器域名地址,微信服务器域名设置
  10. 《置身事内》读书笔记第一章 地方政府的权利与事务