国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Spring Data MongoDB 五:進階文檔查詢(分頁、Morphia)(二)

    Spring Data MongoDB 三:基本文檔查詢(Query、BasicQuery)(一)

    學(xué)習(xí)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類提供方法有l(wèi)imit、skip、sort查詢限制、跳躍、和排序順序的功能,BasicQuery繼承了Query類。

 

Query

Mongodb

說明

Query limit (int limit)

limit

方法是限制游標返回結(jié)果的數(shù)量

Query skip (int skip)

skip

方法可以跳過指定值的條數(shù),返回剩下的條數(shù)的結(jié)果,可以跟limit()方法進行組合可以實現(xiàn)分頁的效果

Sort sort () 已過時

現(xiàn)在是用query.with(sort)

sort

方法來對數(shù)據(jù)進行排序,根據(jù)指定的字段,并使用1或-1來指定排序方式是升序或降序,類似于SQL的order by。

 

二.基本分頁

 

    Query類提供方法有l(wèi)imit、skip、sort查詢限制、跳躍、和排序順序的功能,我們實現(xiàn)Query查詢分頁

 

     第一步:實現(xiàn)分頁工具類

  1. /** 
  2.  * 分頁 
  3.  * @author zhengcy 
  4.  * 
  5.  * @param<T> 
  6.  */  
  7. public classPageModel<T>{  
  8.     //結(jié)果集   
  9.    privateList<T> datas;   
  10.    //查詢記錄數(shù)   
  11.    privateintrowCount;   
  12.    //每頁多少條數(shù)據(jù)   
  13.    privateintpageSize=20;  
  14.    //第幾頁   
  15.    privateintpageNo=1;  
  16.    //跳過幾條數(shù)  
  17.    privateintskip=0;   
  18.    /** 
  19.      * 總頁數(shù) 
  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.      
  61.      
  62. }  


   第二步:實現(xiàn)分頁

       

  1. @Override  
  2. public PageModel<Orders>getOrders(PageModel<Orders> page, DBObject queryObject,StringcollectionName) {  
  3.    Queryquery=newBasicQuery(queryObject);  
  4.    //查詢總數(shù)  
  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 () 已過時,現(xiàn)在是用query.with(sort),with參數(shù)是sort類

   Sort提供了幾種構(gòu)造函數(shù)

      

   方法的描述

      (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("總數(shù):"+page.getRowCount());  
  8.   System.out.println("返回條數(shù):"+page.getDatas().size());  
  9.   System.out.println(JSONArray.fromObject(page.getDatas()));  
  10. }  

 

   查詢條件是cname=zcy

            

        

      skip方法是跳過條數(shù),而且是一條一條的跳過,如果集合比較大時(如書頁數(shù)很多)skip會越來越慢, 需要更多的處理器(CPU),這會影響性能。

三、進階的查詢分頁

 

      返回到匹配文檔的游標,可以隨意修改查詢限制、跳躍、和排序順序的功能,我們這邊對指針返回的結(jié)果,我用到Morphia框架。

       Morphia是一個開放源代碼的對象關(guān)系映射框架,它對MongoDB數(shù)據(jù)庫 Java版驅(qū)動進行了非常輕量級的對象封裝。我們需要通過DBCurosr獲取的DBObject轉(zhuǎn)換成我們對應(yīng)的實體對象,方便我們操作實體。

     DBCurosr 是 DBCollection 的 find 方法返回的對象,可以設(shè)置 skip、limit 、sot等屬性執(zhí)行分頁查詢

 

   第一步:在實體id要注解@id

      importcom.google.code.morphia.annotations.Id;

           @Id

         privateString id;

 

     @Id 注釋指示Morphia哪個字段用作文檔 ID

 

     如果沒加的話,會出現(xiàn)這樣的錯誤

    ...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

 

 

  第二步:實現(xiàn):

  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.       //總數(shù)  
  25.       int count=dbCursor.count();  
  26.       //循環(huán)指針  
  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. }  

   我們開始執(zhí)行DAO時,先初始化Morphia,并往里面添加我們需要轉(zhuǎn)換的實體類CLASS

      morphia=new Morphia();

      morphia.map(Orders.class);

      

   dbCursor.hasNext()判斷是否還有下一個文檔(DBObject),  dbCursor.Next()獲取DBObject時,我們通過Morphia把DBObject對應(yīng)的實體類。

  查詢時通過filterDBObject 設(shè)置返回需要的字段

     

 

      MongoDB服務(wù)器返回的查詢結(jié)果,當調(diào)用cursor.hasNext()時,MongoDB批量的大小不會超過最大BSON文檔大小,然而對于大多數(shù)查詢,第一批返回101文檔或足夠的文件超過1 MB,后續(xù)的批大小為4 MB。如果第一批是返回101個文檔時,遍歷完時,執(zhí)行hasNext,會到數(shù)據(jù)庫查詢結(jié)果,直到所有結(jié)果都被返回,游標才會結(jié)關(guān)閉。

 


 

四.其他的查詢方法

     mongoTemplate .findAll   查詢集合所有的文檔 相當于MongoDB的db.collect.find()。

     mongoTemplate .findById  根據(jù)文檔_ID查詢對應(yīng)的文檔。

     mongoTemplate .findAndRemove  根據(jù)查詢條件,查詢匹配的文檔返回,并從數(shù)據(jù)庫中刪除。


     我們在查詢時,這邊默認是有使用到索引,對于數(shù)據(jù)量大的文檔,需要建立合適的索引,加快查詢效率。





本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Morphia一個nosql的ORM框架
表單生成器(Form Builder)之mongodb表單數(shù)據(jù)查詢——返回分頁數(shù)據(jù)和總條數(shù)
mongodb .explain('executionStats') 查詢性能分析(轉(zhuǎn))
NoSQL 之 Morphia 操作 MongoDB
MongoDB的java版本驅(qū)動
MongoDB數(shù)據(jù)庫文檔CRUD操作教程
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服