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的分页,但是一般的数据展现都需要检索条件,而且是多个条件,所以就变成了 ...
随机推荐
- provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.
通常情况下,要解决这个,你去SQL Server配置管理器(SSCM)和: [1]在SSCM中设置 [1.1]确保共享内存协议启用 [1.2]确保命名管道协议 [1.3]确保TCP / IP被启用,和 ...
- JavaScript--QuckStudy
Day1: 初识JS: https://www.liaoxuefeng.com/wiki/1022910821149312 >打印: alert('我要学JavaScript!'); >J ...
- Ugly Numbers UVA - 136(优先队列+vector)
Problem Description Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, ...
- Swoft2.x 小白学习笔记 (三) --- Task、协程
介绍swoft中 1.Task 2.协程 一:Task任务: 1.配置,在 app/bean.php文件中加入 'httpServer' => [ // ... 'on' => [ Swo ...
- DEDE升级5.7版本后生成页面空白_解…
今天将DEDECMS V5.6升级到DEDECMS V5.7并升级5.7 SP1后,发现生成首页.栏目.内容页均为空白,没有任何反应,今天发布一个解决方法. 发现每个模板中调用过 Html2Text ...
- thinkphp命令行生成模型类
thinkphp命令行生成模型类 当你需要创建大量的模型类的时候,不妨考虑下命令行生成,可以快速创建模型类. 在windows下面,使用Win+R输入cmd进入命令控制台,切换到项目根目录(也就是th ...
- URI解析
这里主要参考 RFC3986 文档. URI可以分为URL,URN或同时具备locators 和names特性的一个东西.URN作用就好像一个人的名字,URL就像一个人的地址.换句话说:URN确定了东 ...
- Jmeter之cookie登录
1.在web登录时,抓取登录的响应头 2.在jmeter中配置cookie HTTP Cookie管理器中添加信息 以下三个字段是必填的 3.添加HTTP请求(直接访问首页) 如果返回成功,并且响应内 ...
- application.properties参数详解
# ----------------------------------------# CORE PROPERTIES# --------------------------------------- ...
- .Net Core 3.0 内置依赖注入:举例
原文:.Net Core 3.0 内置依赖注入:举例 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...