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查询分页

第一步:实现分页工具类

  1. /**
  2. * 分页
  3. * @author zhengcy
  4. *
  5. * @param<T>
  6. */
  7. public classPageModel<T>{
  8. //结果集
  9. privateList<T> datas;
  10. //查询记录数
  11. privateintrowCount;
  12. //每页多少条数据
  13. privateintpageSize=20;
  14. //第几页
  15. privateintpageNo=1;
  16. //跳过几条数
  17. privateintskip=0;
  18. /**
  19. * 总页数
  20. * @return
  21. */
  22. publicintgetTotalPages(){
  23. return(rowCount+pageSize-1)/pageSize;
  24. }
  25.  
  26. public List<T>getDatas() {
  27. return datas;
  28. }
  29. public void setDatas(List<T>datas) {
  30. this.datas = datas;
  31. }
  32. public int getRowCount() {
  33. return rowCount;
  34. }
  35. public void setRowCount(int rowCount) {
  36. this.rowCount = rowCount;
  37. }
  38. public int getPageSize() {
  39. return pageSize;
  40. }
  41. public void setPageSize(int pageSize) {
  42. this.pageSize = pageSize;
  43. }
  44. public int getSkip() {
  45. skip=(pageNo-1)*pageSize;
  46. return skip;
  47. }
  48. public void setSkip(int skip) {
  49. this.skip = skip;
  50. }
  51.  
  52. public int getPageNo() {
  53. return pageNo;
  54. }
  55.  
  56. public void setPageNo(int pageNo) {
  57. this.pageNo = pageNo;
  58. }
  59.  
  60. }

第二步:实现分页

  1. @Override
  2. public PageModel<Orders>getOrders(PageModel<Orders> page, DBObject queryObject,StringcollectionName) {
  3. Queryquery=newBasicQuery(queryObject);
  4. //查询总数
  5. int count=(int) mongoTemplate.count(query,Orders.class);
  6. page.setRowCount(count);
  7.  
  8. //排序
  9. query.with(new Sort(Direction.ASC, "onumber"));
  10. query.skip(page.getSkip()).limit(page.getPageSize());
  11. List<Orders>datas=mongoTemplate.find(query,Orders.class);
  12. page.setDatas(datas);
  13. return page;
  14. }

说明:

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)不同的字段依照不同的排序

  1. List<Sort.Order>orders=new ArrayList<Sort.Order>();
  2. orders.add(newSort.Order(Direction.ASC, "a"));
  3. orders.add(newSort.Order(Direction.DESC, "b"));
  4. query.with(newSort(orders ));

a升序在按b降序

第三步:測试类

  1. @Test
  2. public void testList() throws ParseException
  3. {
  4. PageModel<Orders>page=newPageModel<Orders>();
  5. page.setPageNo(1);
  6. page=ordersDao.getOrders(page, new BasicDBObject("cname","zcy"),collectionName);
  7. System.out.println("总数:"+page.getRowCount());
  8. System.out.println("返回条数:"+page.getDatas().size());
  9. System.out.println(JSONArray.fromObject(page.getDatas()));
  10. }

查询条件是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

  第二步:实现:

  1. privateMorphia morphia;
  2.  
  3. public OrdersDaoImpl(){
  4. morphia= new Morphia();
  5. morphia.map(Orders.class);
  6. }
  7. @Override
  8. public PageModel<Orders>getOrders(PageModel<Orders> page, DBObject queryObject,StringcollectionName) {
  9.  
  10. DBObjectfilterDBObject=newBasicDBObject();
  11. filterDBObject.put("_id", 0);
  12. filterDBObject.put("cname",1);
  13. filterDBObject.put("onumber",1);
  14.  
  15. DBCursordbCursor=mongoTemplate.getCollection(collectionName).find(queryObject,filterDBObject);
  16.  
  17. //排序
  18. DBObjectsortDBObject=newBasicDBObject();
  19. sortDBObject.put("onumber",1);
  20. dbCursor.sort(sortDBObject);
  21. //分页查询
  22. dbCursor.skip(page.getSkip()).limit(page.getPageSize());
  23.  
  24. //总数
  25. int count=dbCursor.count();
  26. //循环指针
  27. List<Orders>datas=newArrayList<Orders>();
  28. while (dbCursor.hasNext()) {
  29. datas.add(morphia.fromDBObject(Orders.class, dbCursor.next()));
  30. }
  31.  
  32. page.setRowCount(count);
  33. page.setDatas(datas);
  34. return page;
  35. }

我们開始运行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)(二)的更多相关文章

  1. SpringMVC MongoDB之“基本文档查询(Query、BasicQuery)”

    一.简介 spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...

  2. Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)

    一.简单介绍 Spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一 ...

  3. Spring Data MongoDB 三:基本文档查询(Query、BasicQuery

    一.简介 spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...

  4. Spring Data MongoDB 分页查询

    在上篇文章 Spring Data MongoDB 环境搭建 基础上进行分页查询 定义公用分页参数类,实现 Pageable 接口 import java.io.Serializable; impor ...

  5. Spring data mongodb 聚合,投射,内嵌数组文档分页.

    尽量别直接用 DBObject  ,Spring data mongodb 的api 本来就没什么多大用处,如果还直接用 DBObject 那么还需要自己去解析结果,说动做个对象映射,累不累 Spri ...

  6. Spring Data MongoDB 四:基本文档改动(update)(一)

    Spring Data MongoDB 三:基本文档查询(Query.BasicQuery)(一) 学习MongoDB 二:MongoDB加入.删除.改动 一.简单介绍 Spring Data  Mo ...

  7. 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南

    1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...

  8. 如何在Spring Data MongoDB 中保存和查询动态字段

    原文: https://stackoverflow.com/questions/46466562/how-to-save-and-query-dynamic-fields-in-spring-data ...

  9. Spring data mongodb ObjectId ,根据id日期条件查询,省略@CreatedDate注解

    先看看ObjectId 的json 结构,非常丰富,这里有唯一机器码,日期,时间戳等等,所以强烈建议ID 使用 ObjectId 类型,并且自带索引 Spring data mongodb 注解 @C ...

随机推荐

  1. Java-Maven:POM百科

    ylbtech-Java-Maven:POM百科 Maven是以项目为中心的设计.POM(project object model)是Maven对一个单一项目的描述.没有POM的话,Maven是毫无用 ...

  2. Node.js:教程

    ylbtech-Node.js:教程 1.返回顶部 1. Node.js 教程 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaS ...

  3. 院校-国外-美国:斯坦福大学( Stanford)

    ylbtech-院校-国外-美国:斯坦福大学( Stanford) 斯坦福大学(Stanford University),全名小利兰·斯坦福大学(Leland Stanford Junior Univ ...

  4. 2014.9.20Hashtable概述

    hashtable叫哈希表,用于表示键值的集合,这些键值对根据键的哈希代码进行组织,其每个元素都存储于DictionaryEntry对象中的键值对.键不能为空引用. count:获取包含在hashta ...

  5. expdp通过dblink远端导出

    环境说明: db62是源端 rac数据库 dw03为需要导入的目标端数据库单机,实例名,服务名,字符串名都为dw03 数据库版本:11.2.0.4  操作系统:rehat 6.7 1.创建dblink ...

  6. 基于MapReduce的贝叶斯网络算法研究参考文献

    原文链接(系列):http://blog.csdn.net/XuanZuoNuo/article/details/10472219 论文: 加速贝叶斯网络:Accelerating Bayesian ...

  7. 4 Python+Selenium的元素定位方法(link/partial link)

    [环境] Python3.6+selenium3.0.2+IE11+win7 [定位方法] 1.link/partial link定位方法:定位的元素为文字链接且链接很长时 方法:find_eleme ...

  8. 00-- 关于C++ const 的全面总结

    转:关于C++ const 的全面总结 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C ...

  9. What's Dead & Exploded in Swift's exception stack?

    The Swift compiler marks function arguments for a number of reasons, mostly related to internal opti ...

  10. jquery里面的选择器

    jQuery 元素选择器 jQuery 使用 CSS 选择器来选取 HTML 元素. $("p") 选取 <p> 元素. $("p.intro") ...