1. 程式人生 > >Spring Data 與MongoDB 整合四:操作篇(查詢)

Spring Data 與MongoDB 整合四:操作篇(查詢)

一.簡介

     spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate對MongoDB的CRUD的操作,上一篇我們介紹了對MongoDB的新增和刪除, 今天我們要介紹Java程式碼實現對MongoDB實現查詢操作。

     我們回顧一下,我們在之前介紹了MongoDB的基本文件查詢,MongoDB的查詢語法:

       db.orders.find({{<field1>:<value1>,<field2>: <value2>, ... } },{field1:<boolean>, field2: <boolean> ... })

      我們介紹是SpringData MongoDB 提供了find方法,方便我們通過java程式碼實現對MongoDB的查詢操作:

       mongoTemplate.find (query, entityClass)

      引數說明:

       entityClass:實體class,也就是要把文件轉換成對應的實體。

      query查詢語句的實現的方式有兩種:

        1.org.springframework.data.mongodb.core.query

          建構函式

          Query (Criteria criteria)

         接受的引數是org.springframework.data.mongodb.core.query.Criteria

         Criteria是標準查詢的介面,可以引用靜態的Criteria.where的把多個條件組合在一起,就可以輕鬆地將多個方法標準和查詢連線起來,方便我們操作查詢語句。

        例如: 查詢條件onumber="002"

        mongoTemplate.find (new Query(Criteria.where("onumber").is("002")),entityClass)

        多個條件組合查詢時:

       例如:onumber="002" and cname="zcy"

         mongoTemplate.find (new Query(Criteria.where("onumber").is("002").and("cname").is("zcy")),entityClass)

       例如:onumber="002" or cname="zcy"

         mongoTemplate.findOne(newQuery(newCriteria().orOperator(Criteria.where("onumber").is("002"),Criteria.where("cname").is("zcy"))),entityClass); 

      我們通過Criteria的and方法,把這個條件組合一起查詢

      Criteria提供了很多方法,我們這邊先介紹基本文件的查詢操作符,對於陣列文件或者內嵌文件的操作符,我們下一篇在介紹。

Criteria

Mongodb

說明

Criteria and (String key)

$and

並且

Criteria andOperator (Criteria…​ criteria)

$and

並且

Criteria orOperator (Criteria…​ criteria)

$or

或者

Criteria gt (Object o)

$gt

大於

Criteria gte (Object o)

$gte

大於等於

Criteria in (Object…​ o)

$in

包含

Criteria is (Object o)

$is

等於

Criteria lt (Object o)

$lt

小於

Criteria lte (Object o)

$lte

小等於

Criteria nin (Object…​ o)

$nin

不包含

。。。。。。。。。。。。。。

   2、子類 org.springframework.data.mongodb.core.query.BasicQuery

     構造方法

         BasicQuery(DBObject queryObject)

         BasicQuery(DBObject queryObject, DBObject fieldsObject)

         BasicQuery(java.lang.String query)

          BasicQuery(java.lang.String query, java.lang.String fields)

         DBObject就是轉換成JSON格式,提供了我們回顧一下,MongoDB查詢時,

             db.collection.find(query,projection),query型別是document,所以,我們想使用JSON字串查詢時,我們使用DBObject建立查詢例項。

                 

               DBObject是介面,提供了幾個子類,

                            

            我們比較經常使用的比較底層子類,擴充套件了自己的方法和繼承父類,所以功能會比較多。

           1. BasicDBObject

                BasicBSONObject extendsLinkedHashMap<String,Object> implements BSONObject

                BasicDBObject extends BasicBSONObject implementsDBObject

               例如:查詢條件onumber="002"

                DBObject obj = new BasicDBObject();

               obj.put( "onumber","002" );

               相當於

                db.collect.find({"onumber":"002"}) 

             2. BasicDBList

                   BasicBSONList extendsArrayList<Object> implements BSONObject

                   BasicDBList extends BasicBSONList implements DBObject

                   BasicDBList可以存放多個BasicDBObject條件

                       例如:我們查詢onumber=002OR cname=zcy1

                         BasicDBList basicDBList=new BasicDBList();

                         basicDBList.add(new BasicDBObject("onumber","002"));

                         basicDBList.add(new BasicDBObject("cname","zcy1"));

                        DBObjectobj =newBasicDBObject();

                       obj.put("$or", basicDBList);

                       Query query=new BasicQuery(obj);

           相當於

                  db.orders.find({$or:[{"onumber":"002"},{"cname":"zcy1"}]})

                      basicDBList.add方法是新增一個文件的查詢條件

             3. com.mongodb. QueryBuilder

                     QueryBuilder預設建構函式,是初始化BasicDBObject,QueryBuilder多個方法標準和查詢連線起來,方便我們操作查詢語句。跟Criteria是標準查詢的介面一樣,

                    

              QueryBuilder和BasicDBObject配合使用

              QueryBuilder幫我們實現了  $and等操作符,我們檢視部分的原始碼:QueryBuilder部分的原始碼:

  1. publicclassQueryBuilder {  
  2.   /** 
  3.     * Creates a builder with an empty query 
  4.     */
  5.   publicQueryBuilder() {  
  6.        _query = new BasicDBObject();  
  7.    }  
  8.   publicQueryBuilder or( DBObject ... ors ){  
  9.        List l = (List)_query.get( "$or" );  
  10.        if ( l == null ){  
  11.            l = new ArrayList();  
  12.            _query.put( "$or" , l );  
  13.        }  
  14.        for ( DBObject o : ors )  
  15.            l.add( o );  
  16.        returnthis;  
  17.   }  
  18.   /** 
  19.     * Equivalent to an $and operand 
  20.     * @param ands 
  21.     * @return 
  22.     */
  23.   @SuppressWarnings("unchecked")  
  24.   publicQueryBuilder and( DBObject ... ands ){  
  25.        List l = (List)_query.get( "$and" );  
  26.        if ( l == null ){  
  27.            l = new ArrayList();  
  28.            _query.put( "$and" , l );  
  29.        }  
  30.        for ( DBObject o : ands )  
  31.            l.add( o );  
  32.        returnthis;  
  33.    }  

                      接下來我們介紹查詢的實現,Criteria提供了很多方法,我們這邊就不在一個一個的操作符執行一遍,這跟學習MongoDB 四: MongoDB查詢(一)基本文件的操作符介紹的一樣。

 二.findOne查詢

         findOne返回滿足指定查詢條件的文件,如果多個文件滿足查詢,該方法返回第一個文件,根據自然順序返回檔案在磁碟上的順序,在覆蓋的集合中,自然順序與插入順序相同。如果沒找到對應的文件,會返回null。

方法:

       mongoTemplate.findOne(query,entityClass)

       1.      介紹介面以及方法的實現

               我們在上一篇有介紹了實現基本的新增,對整個結構有介紹了,我們這邊就不在介紹了,直接介紹往裡面新增方法

              第一步:我們在基礎介面MongoBase.java類新增一個findOne的介面

  1. //根據條件查詢
  2. blic T findOne(Query query,String collectionName);  
           第二步:我們在OrdersDaoImpl類新增一個具體findOne的實現方法
  1. @Override
  2. ublic Orders findOne(Query query, String collectionName) {  
  3. return mongoTemplate.findOne(query, Orders.class, collectionName);  

      第三步:實現測試方法

  1. /測試testFindOne方法新增  
  2.    @Test
  3.    publicvoid testFindOne() throws ParseException  
  4.    {  
  5.      Queryquery=newQuery(Criteria.where("onumber").is("002"));  
  6.      Ordersorder=ordersDao.findOne(query,collectionName);  
  7.      System.out.println(JSONObject.fromObject(order));  
  8.   }  

   我們到MongoDB查詢時,有兩條onumber值相同的文件

  1. > db.orders.find()  
  2. "_id" : ObjectId("55b3ae9bee10ded9390d0b97"),"_class" : "com.mongo.model.Orders""onumber" : "002""date" :ISODate("2015-01-24T16:07:00Z"), "cname" : "zcy1""items" : [ { "quantity" : 5,"price" : 4, "pnumber" : "p001" }, {"quantity" : 6, "price" : 8, "pnumber" :"p002" } ] }  
  3. "_id" : ObjectId("55b3aea5ee10f970a2da7017"),"_class" : "com.mongo.model.Orders""onumber" : "002""date" :ISODate("2015-01-24T16:07:00Z"), "cname" : "zcy2"

    相關推薦

    Spring Data MongoDB 整合:操作查詢

    一.簡介      spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate對MongoDB的CRUD的操作,上一篇我們介紹了對MongoDB的新增和刪除, 今天

    Spring Data MongoDB 整合五:操作分頁

    一.簡介      SpringData  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate對MongoDB的find的操作,我們上一篇介紹了基本文件的查詢,我們今天介紹分頁查詢,分頁查詢

    python記錄—入門到實踐—字符串操作

    span java、 浮點 大寫 數位 tab cnblogs 保留小數 字符串操作 我就跟著書學,總結執行要記錄的,不要覺得簡單就不去試一試,敲一敲代碼。執行力是成為好的程序員的寶劍。如果你是新手在掌握其他的語言情況下比如java、c或者php等等任意一種基本語法,程序都

    部署Django到雲伺服器centos+nginx+mysql+uwsgi+python3操作2

    接上篇操作篇(1):https://blog.csdn.net/jacky_zhuyuanlu/article/details/82880612 (七)建立Django專案 (1)建立資料夾,存放網站 mkdir -p /data/wwwroot

    部署Django到雲伺服器centos+nginx+mysql+uwsgi+python3操作1

    開篇 笛卡爾說:“你不能教會一個人任何東西,你只能幫助他發現他自己內心本來就有的東西!” jacky能教你的,只能是經驗和建議,要逆襲還得通過自己對資料的不斷領悟,資料領域的技能都很簡單,這些知識就在那裡,等待你的覺醒; 我們學習任何技能和知識,目的都是為了實踐,我們學會了手

    資料結構演算法之連結串列

    連結串列作為一種基礎的資料結構之一,我們會常常使用到它,接下來就讓我們一起學習吧。 1、連結串列的經典應用場景: LRU快取淘汰演算法。 2、快取是一種提高資料讀取效能的技術,在硬體設計、軟體開發中都有著非常廣泛的應用,比如常見的CPU快取、資料庫快取、瀏覽器快取等等。

    資料結構演算法之連結串列

    Q:如何輕鬆寫出正確的連結串列程式碼? 總結起來,就是投入時間+技巧; 一、投入時間:          只要願意投入時間,大多數人都是可以學會的,比如說,如果你真能花上一個週末或者一整天時間,就去寫連結

    關於姿態解算融合的程式碼註釋

            加速度計和陀螺儀都能計算出姿態,但為何要對它們融合呢,是因為加速度計對振動之類的擾動很敏感,但長期資料計算出的姿態可信,而陀螺儀雖然對振動這些不敏感,但長期使用陀螺儀會出現漂移,因此我們要進行互補,短期相信陀螺,長期相信加計。不過,其實加計無法對航向角進行

    《JavaScript設計模式開發實踐》模式3—— 代理模式

    代理模式是為一個物件提供一個代用品或佔位符,以便控制對它的訪問 故事背景: 假設當 A 在心情好的時候收到花,小明表白成功的機率有 60%,而當 A 在心情差的時候收到花,小明表白的成功率無限趨近於 0。 小明跟 A 剛剛認識兩天,還無法辨別 A 什麼時候心情好。如果不合時宜地把花送給 A,花

    《JavaScript設計模式開發實踐》模式6—— 命令模式

    命令模式是最簡單和優雅的模式之一,命令模式中的命令(command)指的是一個執行某些特定事情的指令。 應用場景     有時候需要向某些物件傳送請求,但是並不知道請求的接收者是誰,也不知道被請求的操作是什麼。此時希望用一種鬆耦合的方式來設計程式,使得請求

    spring boot使用Jedis整合Redis實現快取AOP

    一:環境準備 1:準備Redis環境 使用redis做快取的話,需要有redis服務,可以將服務部署在遠端伺服器上,也可以部署到本機上。 1.1. 部署在linux伺服器 1.1.1安裝Redis #安裝redis,當前最新的版本是redis-5.0.0.

    Spring原始碼解析--《SPRING技術內幕:深入解析Spring架構設計原理》讀書筆記:IOC容器初始化過程

    通過閱讀相關章節內容,Spring中IOC容器的載入中,我們需要了解下列幾個概念: Resource:是一個定位、訪問資源的抽象介面,包含了多種資源操作的基礎方法定義,如getInputStream()、exists()、isOpen()、getD

    《JavaScript設計模式開發實踐》模式11—— 中介者模式

    中介者模式的作用就是解除物件與物件之間的緊耦合關係。增加一箇中介者物件後,所有的 相關物件都通過中介者物件來通訊,而不是互相引用,所以當一個物件發生改變時,只需要通知 中介者物件即可。中介者使各物件之間耦合鬆散,而且可以獨立地改變它們之間的互動。中介者模式使網狀的多對多關係變成了相對簡單的一對多關係

    《JavaScript設計模式開發實踐》模式12—— 裝飾者模式

    在傳統的面嚮物件語言中,給物件新增功能常常使用繼承的方式,但是繼承的方式並不靈活, 還會帶來許多問題:一方面會導致超類和子類之間存在強耦合性,當超類改變時,子類也會隨之 改變;另一方面,繼承這種功能複用方式通常被稱為“白箱複用”,“白箱”是相對可見性而言的, 在繼承方式中,超類的內部細節是對子類可見的,

    《JavaScript設計模式開發實踐》原則2—— 最少知識原則

    最少知識原則(LKP)說的是一個軟體實體應當儘可能少地與其他實體發生相互作用。這 裡的軟體實體是一個廣義的概念,不僅包括物件,還包括系統、類、模組、函式、變數等。 單一職責原則指導我們把物件劃分成較小的粒度,這可以提高物件的可複用性。但越來越 多的物件之間可能會產生錯綜複雜的聯絡,如果修改了其中一個物件

    《JavaScript設計模式開發實踐》原則3—— 開放-封閉原則

    在面向物件的程式設計中,開放封閉原則(OCP)是最重要的一條原則。很多時候,一個程式具有良好的設計,往往說明它是符合開放封閉原則的。 當需要改變一個程式的功能或者給這個程式增加新功能的時候,可以使用增加程式碼的方式,但是不允許改動程式的原始碼。 故事背景 假設我們是一個大型 Web 專案的維護人

    spring data solr 使用內嵌Solr伺服器單核

    SpringDataSolr Maven配置: <solr.version>4.7.0</solr.version> <spring.data.solr.version>1.2.0.RELEASE</spring.data.solr

    Spring Data MongoDB 一:入門環境搭建、簡單的CRUD操作

    一.簡介      Spring Data  MongoDB 專案提供與MongoDB文件資料庫的整合。Spring Data MongoDB POJO的關鍵功能區域為中心的模型與MongoDB的DBCollection輕鬆地編寫一個儲存庫互動資料訪問。 二.Spring

    輕輕鬆鬆學習SpringBoot2:第二十五Spring Boot和Mongodb整合完整版

    今天主要講的是Spring Boot和Mongodb整合我們先來回顧一下前面章節的相關內容前面我們講了SpringBoot和mysql整合,並且講了操作資料庫的幾種方式自動生成表資料庫操作操作篇回到正題,mongodb的安裝在這就不累述了,win版本的去官網下載,然後一直下一

    Spring+SpringMVC+MyBatis+easyUI整合優化easyUI富文字編輯器UEditor整合

    日常囉嗦 本來這一篇和接下來的幾篇是打算講一下JDBC和資料庫優化的,但是最近很多朋友加我好友也討論了一些問題,我發現大家似乎都是拿這個專案作為練手專案,作為腳手架來用的,因此呢,改變了一下思路,JDBC和資料庫優化這一塊兒延後一點再去說,先豐富一下專案的頁面