一、使用limit和skip进行分页查询

public List<User> pageList(int pageNum ,int pageSize){
List<User> userList = new ArrayList<>();
Mongo mg = new Mongo();
DB db = mg.getDB("data");
DBCollection coll = db.getCollection("t_user");
DBCursor limit = coll.find().skip((pageNum-1)*pageSize).sort(new BasicDBObject()).limit(pageSize);
while (limit.hasNext()){
userList.add(parse(new User(),limit.next()));
}
return userList;
} private User parse(User user,DBObject obj){
user.setAge((int) obj.get("age"));
user.setName((String)obj.get("name"));
user.setPwd((String)obj.get("pwd"));
return user;
} //查询结果 1,2
[
{
"id": null,
"name": "ljl",
"pwd": "123456",
"age": 24
},
{
"id": null,
"name": "lsr",
"pwd": "123456",
"age": 18
}
]

通过skip和limit方法可以简单的实现分页操作,但是如果数据量特别巨大的时候,会出现性能的问题,建议不使用!

二、通过原生的方法实现条件查询、分页和排序

public Page<User> getPageByOriginalFunction(int age,int pageNUmber,int pageSize){
//查询条件,可以传递多个查询条件
User user = new User();
user.setAge(age);
Example<User> example = Example.of(user); //分页条件
//Pageable pageable = new PageRequest(pageNUmber,pageSize);
Pageable pageable = PageRequest.of(pageNUmber,pageSize); return secondRepository.findAll(example,pageable); } //查询结果
{
"content": [
{
"id": "5cfb69ee4332ce07b864d12e",
"name": "lsr",
"pwd": "123456",
"age": 18
}
],
"pageable": {
"sort": {
"sorted": false,
"unsorted": true
},
"offset": 0,
"pageSize": 2,
"pageNumber": 0,
"unpaged": false,
"paged": true
},
"last": true,
"totalPages": 1,
"totalElements": 1,
"number": 0,
"size": 2,
"sort": {
"sorted": false,
"unsorted": true
},
"first": true,
"numberOfElements": 1
}

三、通过实现Pageable接口,自定义

1.创建自定义分页类,实现Pageable接口

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import javax.validation.constraints.Min; @NoArgsConstructor
@AllArgsConstructor
public class SpringDataPageAble implements Pageable { @Min(1)
private Integer pageNumber = 1;
@Min(1)
private Integer pageSize = 10;
private Sort sort; public void setSort(Sort sort) {
this.sort = sort;
} // 当前页面
@Override
public int getPageNumber() {
return this.pageNumber;
} // 每一页显示的条数 @Override
public int getPageSize() {
return getPagesize();
} // 第二页所需要增加的数量 @Override
public long getOffset() {
return (getPageNumber() - 1) * getPagesize();
} @Override
public Sort getSort() {
return sort;
} public void setPagenumber(Integer pagenumber) {
this.pageNumber = pageNumber;
} public Integer getPagesize() {
return this.pageSize;
} public void setPagesize(Integer pagesize) {
this.pageSize = pagesize;
} @Override
public Pageable next() {
return null;
} @Override
public Pageable previousOrFirst() {
return null;
} @Override
public Pageable first() {
return null;
} @Override
public boolean hasPrevious() {
return false;
}
}

2.在repository层定义分页方法

import com.tedu.huawei.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository; public interface UserFirstRepository extends MongoRepository<User,String> {
Page<User> getUserByAgeGreaterThan(int age, Pageable pageAble);
}

3.service层调用方法

public Page<User> getUserByAgeGraterThan(int age, int pageNumber,int pageSize){
SpringDataPageAble springDataPageAble = new SpringDataPageAble(pageNumber,pageSize,new Sort(Sort.Direction.ASC,"age"));
return firstRepository.getUserByAgeGreaterThan(age,springDataPageAble);
}

查询结果显示

{
"content": [
{
"id": "5cfb66114332ce07b864d12d",
"name": "lsr",
"pwd": "123456",
"age": 18
},
{
"id": "5cfb85084332ce4ffca97907",
"name": "panzi",
"pwd": "654321",
"age": 24
}
],
"pageable": {
"pageNumber": 1,
"pageSize": 2,
"sort": {
"sorted": true,
"unsorted": false
},
"offset": 0,
"pagesize": 2,
"unpaged": false,
"paged": true
},
"last": true,
"totalPages": 1,
"totalElements": 2,
"number": 1,
"size": 2,
"sort": {
"sorted": true,
"unsorted": false
},
"first": false,
"numberOfElements": 2
}

四、总结
第一种方式实现简单方便,但是不适用于大数据量。第二种分页是原生的方法,不需要做额外的处理,但是查询条件单一,不能设置大于等于或者在某某之间,以及模糊查询有很大的限制。第三种方式实现也很简单,但是更加开放和使用性能好。

————————————————
版权声明:本文为CSDN博主「笑不语」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43935907/article/details/91354738

mongodb多条件分页查询的三种方法(转)的更多相关文章

  1. Oracle 数据库分页查询的三种方法

    一.Oracle 数据库分页查询的三种方法 1.简介 不能对 rownum 使用 >(大于或等于 1 的数值).>=(大于 1 的数值).=(不等于 1 的数值),否则无结果.所以直接用 ...

  2. 【SQL】Oracle分页查询的三种方法

    [SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...

  3. JavaWeb分页显示内容之分页查询的三种思路(数据库分页查询)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6134851.html 在开发过程中,经常做的一件事,也是最基本的事,就是从数据库中查询数据,然后在客户端显示出 ...

  4. SQL 分页查询的四种方法

    方法一 假设现在有这样的一张表: CREATE TABLE test ( id int primary key not null identity, names ) ) 然后向里面插入大约100条数据 ...

  5. springboot jpa mongodb 多条件分页查询

    public Page<Recorded> getRecordeds(Integer page, Integer size, Recorded recorded) { if (page&l ...

  6. 分页查询的两种方法(双top 双order 和 row_number() over ())

    --跳过10条取2条 也叫分页select top 2 * from studentwhere studentno not in (select top 2 studentno from studen ...

  7. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  8. ASPNETCOREAPI 跨域处理 SQL 语句拼接 多条件分页查询 ASPNET CORE 核心 通过依赖注入(注入服务)

    ASPNETCOREAPI 跨域处理 AspNetCoreApi 跨域处理 如果咱们有处理过MV5 跨域问题这个问题也不大. (1)为什么会出现跨域问题:  浏览器安全限制了前端脚本跨站点的访问资源, ...

  9. asp.net mvc多条件+分页查询解决方案

    开发环境vs2010 css:bootstrap js:jquery bootstrap paginator 原先只是想做个mvc的分页,但是一般的数据展现都需要检索条件,而且是多个条件,所以就变成了 ...

随机推荐

  1. [转帖]瀚高数据库创建uuid的方法

    使用syssso登录,并执行下列语句 highgo=> select set_secure_level('off'); set_secure_level -------------------- ...

  2. 使用SecureCRT连接虚拟机中Linux系统 和 虚拟机网络配置

    使用SecureCRT连接步骤:1.首先打开虚拟机,点击左上角的编辑,再点击虚拟网络编辑器(已经进行虚拟网络编辑的忽略此步骤,直接进行第二步) 点击VMnet8网络,点击更改设置,此步骤需要管理员权限 ...

  3. ArrayList类的set()方法

    ArrayList类的set()方法用于更新指定位置的内容,若内容是new出来的,则需要调用该set()方法:否则,不需要调用该set()方法,示例如下 User.java public class ...

  4. 垃圾分类API

    ###自从上月开始实行垃圾分类,整个上海人都已经“疯掉”了.那么,我们应该怎么识别什么是“垃圾”呢? 这里,我提供了并整理了几个api,其中包括图像识别,垃圾分类查找,根据关键字或者图片的内容来进行查 ...

  5. sp_addlinkedserver 跨服务器连接数据库查询

    ----创建远程链接服务器--exec sys.sp_addlinkedserver --@server='LMS',--被访问的服务器别名--@srvproduct='',--@provider=' ...

  6. JS基础_break和continue

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. O036、Snapshot Instance 操作详解

    参考https://www.cnblogs.com/CloudMan6/p/5510296.html   有时候系统损坏的很严重,通过 Rescue 操作无法修复,那么我们就得重新考虑通过备份恢复了. ...

  8. 【科创人上海行】Tinyfool郝培强 :始于不惑的微服务式创业,背负身心病痛贴地飞行

    Intro 科创人,分享技术创业者的成长与创业经验. 何谓创业?勇于面对未知.肩负重任的人生抉择. 何谓经验?沟沟坎坎.有笑有泪,各有其宝贵. 科创人的价值支点是"人",我们不以市 ...

  9. 三主机配置 keepalived VIP高可用

    三台主机: 192.168.33.134 192.168.33.136 192.168.33.137   实验前: 关闭selinux 和iptables     1). 192.168.33.134 ...

  10. mysql的decimal(10,0) not null问题

    今天排查一个bug发现开发环境老是报错 order_num 字段insert的时候不能为空,但是发现测试环境没有这个问题. 后来发现测试环境有一个数据库docker安装的mysql 版本是5.7  而 ...