Spring Data MongoDB 五:进阶文档查询(分页、Morphia)(二)
Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)
学习MongoDB 六: MongoDB查询(游标操作、游标信息)(三)
一.简单介绍
SpringData MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的find的操作。我们上一篇介绍了基本文档的查询,我们今天介绍分页查询,分页查询是返回到匹配文档的游标,能够任意改动查询限制、跳跃、和排序顺序的功能。
我们在查询时find()方法接受Query类型有org.springframework.data.mongodb.core.query和org.springframework.data.mongodb.core.query.BasicQuery
Query类提供方法有limit、skip、sort查询限制、跳跃、和排序顺序的功能,BasicQuery继承了Query类。
Query |
Mongodb |
说明 |
Query limit (int limit) |
limit |
方法是限制游标返回结果的数量 |
Query skip (int skip) |
skip |
方法能够跳过指定值的条数,返回剩下的条数的结果,能够跟limit()方法进行组合能够实现分页的效果 |
Sort sort () 已过时 如今是用query.with(sort) |
sort |
方法来对数据进行排序,依据指定的字段。并使用1或-1来指定排序方式是升序或降序,类似于SQL的order by。 |
二.基本分页
Query类提供方法有limit、skip、sort查询限制、跳跃、和排序顺序的功能。我们实现Query查询分页
第一步:实现分页工具类
/**
* 分页
* @author zhengcy
*
* @param<T>
*/
public classPageModel<T>{
//结果集
privateList<T> datas;
//查询记录数
privateintrowCount;
//每页多少条数据
privateintpageSize=20;
//第几页
privateintpageNo=1;
//跳过几条数
privateintskip=0;
/**
* 总页数
* @return
*/
publicintgetTotalPages(){
return(rowCount+pageSize-1)/pageSize;
} public List<T>getDatas() {
return datas;
}
public void setDatas(List<T>datas) {
this.datas = datas;
}
public int getRowCount() {
return rowCount;
}
public void setRowCount(int rowCount) {
this.rowCount = rowCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getSkip() {
skip=(pageNo-1)*pageSize;
return skip;
}
public void setSkip(int skip) {
this.skip = skip;
} public int getPageNo() {
return pageNo;
} public void setPageNo(int pageNo) {
this.pageNo = pageNo;
} }
第二步:实现分页
@Override
public PageModel<Orders>getOrders(PageModel<Orders> page, DBObject queryObject,StringcollectionName) {
Queryquery=newBasicQuery(queryObject);
//查询总数
int count=(int) mongoTemplate.count(query,Orders.class);
page.setRowCount(count); //排序
query.with(new Sort(Direction.ASC, "onumber"));
query.skip(page.getSkip()).limit(page.getPageSize());
List<Orders>datas=mongoTemplate.find(query,Orders.class);
page.setDatas(datas);
return page;
}
说明:
Sort :sort () 已过时。如今是用query.with(sort)。with參数是sort类
Sort提供了几种构造函数
方法的描写叙述
(1)一个字段的排序
比如onumber字段升序
query.with(new Sort(Direction.ASC,"onumber"));
(2)假设是多个字段时同一时候升序或者降序时
//排序
query.with(new Sort(Direction.ASC,"a","b","c"));
(3)不同的字段依照不同的排序
List<Sort.Order>orders=new ArrayList<Sort.Order>();
orders.add(newSort.Order(Direction.ASC, "a"));
orders.add(newSort.Order(Direction.DESC, "b"));
query.with(newSort(orders ));
a升序在按b降序
第三步:測试类
@Test
public void testList() throws ParseException
{
PageModel<Orders>page=newPageModel<Orders>();
page.setPageNo(1);
page=ordersDao.getOrders(page, new BasicDBObject("cname","zcy"),collectionName);
System.out.println("总数:"+page.getRowCount());
System.out.println("返回条数:"+page.getDatas().size());
System.out.println(JSONArray.fromObject(page.getDatas()));
}
查询条件是cname=zcy
skip方法是跳过条数。并且是一条一条的跳过。假设集合比較大时(如书页数非常多)skip会越来越慢, 须要很多其它的处理器(CPU)。这会影响性能。
三、进阶的查询分页
返回到匹配文档的游标,能够任意改动查询限制、跳跃、和排序顺序的功能,我们这边对指针返回的结果。我用到Morphia框架。
Morphia是一个开放源码的对象关系映射框架,它对MongoDB数据库 java版驱动进行了很轻量级的对象封装。我们须要通过DBCurosr获取的DBObject转换成我们相应的实体对象,方便我们操作实体。
DBCurosr 是 DBCollection 的 find 方法返回的对象,能够设置 skip、limit 、sot等属性运行分页查询
第一步:在实体id要注解@id
importcom.google.code.morphia.annotations.Id;
@Id
privateString id;
@Id 凝视指示Morphia哪个字段用作文档 ID
假设没加的话,会出现这种错误
...27 more
Caused by:
com.google.code.morphia.mapping.validation.ConstraintViolationException: Number of violations: 1
NoId complained aboutcom.mongo.model.Orders. : No field is annotated with @Id; but it is required
atcom.google.code.morphia.mapping.validation.MappingValidator.validate(MappingValidator.java:66)
atcom.google.code.morphia.mapping.validation.MappingValidator.validate(MappingValidator.java:155)
atcom.google.code.morphia.mapping.MappedClass.validate(MappedClass.java:259)
atcom.google.code.morphia.mapping.Mapper.addMappedClass(Mapper.java:154)
atcom.google.code.morphia.mapping.Mapper.addMappedClass(Mapper.java:142)
atcom.google.code.morphia.Morphia.map(Morphia.java:55)
atcom.mongo.dao.impl.OrdersDaoImpl.<init>(OrdersDaoImpl.java:37)
atsun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
atsun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
atsun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
atjava.lang.reflect.Constructor.newInstance(Unknown Source)
atorg.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
... 29more
第二步:实现:
privateMorphia morphia; public OrdersDaoImpl(){
morphia= new Morphia();
morphia.map(Orders.class);
}
@Override
public PageModel<Orders>getOrders(PageModel<Orders> page, DBObject queryObject,StringcollectionName) { DBObjectfilterDBObject=newBasicDBObject();
filterDBObject.put("_id", 0);
filterDBObject.put("cname",1);
filterDBObject.put("onumber",1); DBCursordbCursor=mongoTemplate.getCollection(collectionName).find(queryObject,filterDBObject); //排序
DBObjectsortDBObject=newBasicDBObject();
sortDBObject.put("onumber",1);
dbCursor.sort(sortDBObject);
//分页查询
dbCursor.skip(page.getSkip()).limit(page.getPageSize()); //总数
int count=dbCursor.count();
//循环指针
List<Orders>datas=newArrayList<Orders>();
while (dbCursor.hasNext()) {
datas.add(morphia.fromDBObject(Orders.class, dbCursor.next()));
} page.setRowCount(count);
page.setDatas(datas);
return page;
}
我们開始运行DAO时,先初始化Morphia,并往里面加入我们须要转换的实体类CLASS
morphia=new Morphia();
morphia.map(Orders.class);
dbCursor.hasNext()推断是否还有下一个文档(DBObject), dbCursor.Next()获取DBObject时。我们通过Morphia把DBObject相应的实体类。
查询时通过filterDBObject 设置返回须要的字段
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
MongoDBserver返回的查询结果,
当调用cursor.hasNext()时。MongoDB批量的大小不会超过最大BSON文档大小,然而对于大多数查询,第一批返回101文档或足够的文件超过1
MB,兴许的批大小为4 MB。假设第一批是返回101个文档时,遍历完时,运行hasNext,会到数据库查询结果。直到全部结果都被返回,游标才会结关闭。
四.其它的查询方法
mongoTemplate .findAll 查询集合全部的文档 相当于MongoDB的db.collect.find()。
mongoTemplate .findById 依据文档_ID查询相应的文档。
mongoTemplate .findAndRemove 依据查询条件。查询匹配的文档返回。并从数据库中删除。
我们在查询时,这边默认是有使用到索引,对于数据量大的文档,须要建立合适的索引。加快查询效率。
Spring Data MongoDB 五:进阶文档查询(分页、Morphia)(二)的更多相关文章
- SpringMVC MongoDB之“基本文档查询(Query、BasicQuery)”
一.简介 spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...
- Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)
一.简单介绍 Spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一 ...
- Spring Data MongoDB 三:基本文档查询(Query、BasicQuery
一.简介 spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...
- Spring Data MongoDB 分页查询
在上篇文章 Spring Data MongoDB 环境搭建 基础上进行分页查询 定义公用分页参数类,实现 Pageable 接口 import java.io.Serializable; impor ...
- Spring data mongodb 聚合,投射,内嵌数组文档分页.
尽量别直接用 DBObject ,Spring data mongodb 的api 本来就没什么多大用处,如果还直接用 DBObject 那么还需要自己去解析结果,说动做个对象映射,累不累 Spri ...
- Spring Data MongoDB 四:基本文档改动(update)(一)
Spring Data MongoDB 三:基本文档查询(Query.BasicQuery)(一) 学习MongoDB 二:MongoDB加入.删除.改动 一.简单介绍 Spring Data Mo ...
- 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...
- 如何在Spring Data MongoDB 中保存和查询动态字段
原文: https://stackoverflow.com/questions/46466562/how-to-save-and-query-dynamic-fields-in-spring-data ...
- Spring data mongodb ObjectId ,根据id日期条件查询,省略@CreatedDate注解
先看看ObjectId 的json 结构,非常丰富,这里有唯一机器码,日期,时间戳等等,所以强烈建议ID 使用 ObjectId 类型,并且自带索引 Spring data mongodb 注解 @C ...
随机推荐
- 09-JavaScript高级
今日知识 1. Dom(文档对象模型) 2. Bom(浏览器对象模型) 3. 总结 Dom 1. 获取id为div1的元素对象. * var result=document.getElementByI ...
- Codeforces Round #453
Visiting a Friend Solution Coloring a Tree 自顶向下 Solution Hashing Trees 连续2层节点数都超过1时能异构 Solution GCD ...
- asp.net URL传递中文参数System.Web.HttpUtility.UrlEncode与Server.UrlEncode的区别
asp.net URL传递中文参数System.Web.HttpUtility.UrlEncode与Server.UrlEncode的区别(一) HttpUtility.UrlEncode 方法: 对 ...
- H5 微信公众号 监听返回事件
/*-----监听返回事件-----*/ function pushHistory(returnUrl,currentUrl,currentTitle) { window.addEventListen ...
- 【Oracle】审计
1.审计的功能:监控用户在database 的 action (操作) 2.审计分类: 1) session :在同一个session,相同的语句只产生一个审计结果(默认) 2) access : 在 ...
- 配置DCOM中excel权限
ASP.NET 导出Excel 错误解决备忘 网站项目要用到导出为excel文件的功能,程序运行时报错:"检索 COM 类工厂中 CLSID 为{000-0000-0000-C0046} 的 ...
- PHP Base64 加密 & 解密
<?php 加密: $cany = 'getshell.top'; #定义要加密的字符串 echo base64_encode($cany); #输出加密后的字符串 解密: $cany = 'Z ...
- Pycharm 设置
1:显示行号 打上对勾OK 2:设置作者 & 文件编码 3:选择切换Python的版本
- System.Windows.Forms.WebBrowser中 处理 js 脚本 window.Open 禁止新建窗口 的方法
wb 是 拖放在窗体上的 System.Windows.Forms.WebBrowser 在你的窗体代码中定义 SHDocVw.WebBrowser_V1 wb1; 在 你窗体的 load 事件中 加 ...
- VA Code编写html(1)
<html> <head> <title>my webside</title> <!--win+‘/’注释行--> <!--防止中文乱 ...