mongodb多条件分页查询的三种方法(转)
一、使用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多条件分页查询的三种方法(转)的更多相关文章
- Oracle 数据库分页查询的三种方法
一.Oracle 数据库分页查询的三种方法 1.简介 不能对 rownum 使用 >(大于或等于 1 的数值).>=(大于 1 的数值).=(不等于 1 的数值),否则无结果.所以直接用 ...
- 【SQL】Oracle分页查询的三种方法
[SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...
- JavaWeb分页显示内容之分页查询的三种思路(数据库分页查询)
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6134851.html 在开发过程中,经常做的一件事,也是最基本的事,就是从数据库中查询数据,然后在客户端显示出 ...
- SQL 分页查询的四种方法
方法一 假设现在有这样的一张表: CREATE TABLE test ( id int primary key not null identity, names ) ) 然后向里面插入大约100条数据 ...
- springboot jpa mongodb 多条件分页查询
public Page<Recorded> getRecordeds(Integer page, Integer size, Recorded recorded) { if (page&l ...
- 分页查询的两种方法(双top 双order 和 row_number() over ())
--跳过10条取2条 也叫分页select top 2 * from studentwhere studentno not in (select top 2 studentno from studen ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- ASPNETCOREAPI 跨域处理 SQL 语句拼接 多条件分页查询 ASPNET CORE 核心 通过依赖注入(注入服务)
ASPNETCOREAPI 跨域处理 AspNetCoreApi 跨域处理 如果咱们有处理过MV5 跨域问题这个问题也不大. (1)为什么会出现跨域问题: 浏览器安全限制了前端脚本跨站点的访问资源, ...
- asp.net mvc多条件+分页查询解决方案
开发环境vs2010 css:bootstrap js:jquery bootstrap paginator 原先只是想做个mvc的分页,但是一般的数据展现都需要检索条件,而且是多个条件,所以就变成了 ...
随机推荐
- 2019牛客暑期多校训练营(第七场)-B Irreducible Polynomial(多项式因式分解)
题目链接:https://ac.nowcoder.com/acm/contest/887/B 题意:给定整系数多项数,判断实数域上是否可约. 思路: AC代码: #include<cstdio& ...
- 【转帖】linux sort,uniq,cut,wc,tr,xargs命令详解
linux sort,uniq,cut,wc,tr,xargs命令详解 http://embeddedlinux.org.cn/emb-linux/entry-level/201607/21-5550 ...
- DOS ftp
C:\>ftp /? 将文件传送到运行 FTP 服务器服务(经常称为后台程序)的计算机以及将文件从该计算机传出.可以交互使用 Ftp. FTP [-v] [-d] [-i] [-n] [-g] ...
- MyBatis学习存档(1)——入门
一.简介 MyBatis的前身是iBatis,本是Apache的一个开源的项目 MyBatis是一个数据持久层(ORM)框架,把实体类和SQL语句之间建立了映射关系,是一种半自动化的ORM实现 MyB ...
- url编码问题小计
昨天通过get访问服务器遇到了服务器获取不到参数的问题,最后排查下来是因为url编码的原因,之前使用的是字符串拼接,所以有一些特殊字符如‘%’没有正确的编码, 通过改成各个部分编码,正确获取到数据. ...
- [IOI2005]Riv河流
题目链接:洛谷,BZOJ 前置知识:莫得 题解 直接考虑dp.首先想法是设状态 \(dp[u][i]\) 表示u的子树内建 \(i\) 个伐木场且子树内木头都运到某个伐木场的最小花费.发现这样的状态是 ...
- NYOJ 石子合并(一) 区间dp入门级别
描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价 ...
- C#绘图、画笔相关
dg.SmoothingMode = SmoothingMode.HighSpeed; //高质量 dg.PixelOffsetMode = PixelOffsetMode.HighSpeed; // ...
- 深度:Hadoop对Spark五大维度正面比拼!
每年,市场上都会出现种种不同的数据管理规模.类型与速度表现的分布式系统.在这些系统中,Spark和hadoop是获得最大关注的两个.然而该怎么判断哪一款适合你? 如果想批处理流量数据,并将其导入HDF ...
- vue axios异步请求django
1,配置请求路径 (1),vue中的请求路径要与django视图路径相同. (2),vue中的路由路径也要和django视图路径相同,比如视图路径为127.0.0.1:8000:home/index, ...