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)(二)的更多相关文章

  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. 【转】IOS中Json解析的四种方法

    原文网址:http://blog.csdn.net/enuola/article/details/7903632 作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有 ...

  2. golang互斥锁和读写锁

    一.互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段.它由标准库代码包sync中的Mutex结构体类型代表.sync.Mutex类型(确切地说,是*sync.Mutex类型)只有两个公开 ...

  3. BZOJ 2073

    思路: 状压DP  枚举子集 //By SiriusRen #include <cstdio> #include <cstring> #include <algorith ...

  4. 第5章分布式系统模式 Data Transfer Object(数据传输对象)

    正在设计一个分布式应用程序,为了满足单个客户端请求,您发现自己对一个远程接口发出了多个调用,而这些调用所增加的响应时间超出了可接受的程度. 影响因素 在与远程对象通信时,请考虑下列需要权衡的因素: 远 ...

  5. SaltStact自动化运维工具03

    存储位置   类型      采集方式                 场景Grains    minion        静态    minion启动时,可以刷新    1.获取信息 2.匹配pil ...

  6. 【转】Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)

      阅读目录 目录 Oracle集群概念和原理 RAC概述 RAC 集成集群件管理 RAC 的体系结构 RAC 的结构组成和机制 RAC 后台进程 RAC 共享存储 RAC 数据库和单实例数据库的区别 ...

  7. php实现多图上传功能

    总共三个文化  index.html   conn.php  upload.php index.html代码: <html> <head>上传文件</head> & ...

  8. Hadoop 技术笔记

    Flume与Kafka Flume 是一个分布式,可靠的,可用的服务,有效的收集,聚合和移动海量的日志数据.它有一个简单而灵活的架构,基于流数据流.具有很好的冗余和容错性,以及可靠性和多故障转移和恢复 ...

  9. Be born

    2018-07-22 16:22:03 Cherry is being greater and greater!

  10. [USACO08NOV]奶牛混合起来Mixed Up Cows(状态压缩DP)

    题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a unique serial number S_i (1 <= S_i & ...