1. 程式人生 > >mongoTemplate通過Query條件指定查詢條件和返回欄位

mongoTemplate通過Query條件指定查詢條件和返回欄位

一.簡介

     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. 相關推薦

    mongoTemplate通過Query條件指定查詢條件返回

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

    elasticsearch中的綜合查詢指定返回, 過濾條件、排序、每頁展示條數)

    { "_source": ["write_date"], "query":{"match_all": {}}, "sort": [ { "datedb": { "order": "desc" } } ], "from"

    利用es-head 刪除指定查詢條件中的資料

    在head中的複合查詢中選擇DELETE 引數用_query 例如刪除type 為gz_xx某個特定時間內的資料 http://xxx.xx.xxx.xx:9200/yuyinsearch-2016.01/gz_xx/ 引數為_query 請求體為: {   "query"

    SpringData通過@Query註解支援JPA語句原生SQL語句

    在SpringData中們可是使用繼承介面直接按照規則寫方法名即可完成查詢的方法,不需要寫具體的實現,但是這樣寫又是不能滿足我們的需求,比如子查詢,SpringData中提供了@Query註解可以讓我們寫JPA的語句和原生的SQL語句,那接下來看看怎麼寫JPA的查詢語句和原生

    C#查詢ACCESS資料庫時間

    查詢表的所有欄位 string.Format("SELECT * FROM{0}", TableName); 查詢表中的一個欄位 在ACCESS中將欄位用CStr()轉換成字串來判斷 string.Format("SELECT* FROM {0} WHERE CStr({1})=

    Oracle觸發器條件更改新插入記錄的

    最近,有個專案功能需要在Oracle資料庫中對錶的記錄做動態更新,實現一插入指定條件的記錄,就修改相關欄位值。嘗試了下,最終做到每當插入時就能夠更新記錄某欄位值。 這裡用PL/SQL做了相關實現。 相關表名稱為Person ,其屬性欄位如下: 具體需求為:當插入記錄年齡(欄位A

    剛剛釋出 logstash通過webhdfs放入hdfs增加時間戳host

    1.問題描述 logstash通過webhdfs外掛把資料放入hdfs的時候,發現每行資料的簽名都增加了一個時間戳和host欄位 2018-12-19T08:30:30.234Z %{host} "128.1.1.2" "GET" #2.資料查詢 在網上找了很多資料,描述的都是

    C# 如何獲取SQL Server 中指定資料表的所有型別

    如何獲取指定資料表的所有欄位名和欄位型別。SqlConnection.GetSchema方法有2個過載形式,獲取指定資料表的所有欄位名和欄位型別的祕密就在GetSchema (String, String[])的第二個引數中。 定義如下: public override DataTable GetS

    YII2 多表關聯ar查詢副表某

    一對多 a表 id  status 1       1 b表 id  income  aid 1     1000      1 2    &nb

    Oracle資料庫裡面查詢字串型別的不為空為空的SQL語句:

    摘要:近期專案中,在做高階查詢的時候有個條件是根據選擇的欄位,然後再選擇欄位的值為空和不為空做查詢,在寫SQL語句的時候費了很長時間,現在記錄一下,方便日後檢視: 一:查詢字串型別的欄位的值不為空的S

    查詢資料庫的 sql語句 返回 類 屬性的關係

    資料庫的資料表 實體類 package exer; public class Student { //流水號 private int flowId; //考試的型別 private int type; //身份證號 private String idCa

    查詢sql server 2005 名稱註釋

    SELECT  表名               =   CASE   WHEN   A.COLORDER=1   THEN   D.NAME   ELSE   ' '   END,表備註           =   CASE   WHEN   A.COLORDER=1  

    sqlserver中用不重複的條件更新兩個表對應

    表T1和表T2,表T2的F23欄位用表T1的F3欄位更新,條件是T1.F2=T2.F22並且只有T1.F2和T2.F22是一一對應,T1只有一條記錄和T2對應,例子如下: create table t1(f1 int,f2 varchar(10),f3 varchar(1

    oracle資料庫查詢某個表的資訊

    (1)查詢整個資料庫所有表的欄位 select t.column_name from user_col_comments t;(一般建議去執行,因為資料庫表過多執行起來會非常的慢) (2)查詢特定表名的表字段 select t.column_name, t.column_name&nbs

    sql中連線多個結果集查詢符合要求的

    1.sql中將查詢到的結果集作為一個表去連線多個結果集查詢想要的欄位,適用於查詢複雜邏輯的欄位; 舉例: select dd.base_grade_value,count(distinct dd.userid) from  (select cc.school_id,bb.us

    檢視當前mysql的指定庫的指定表的所有列

    -- 檢視當前mysql的所有資料庫  select * from INFORMATION_SCHEMA.SCHEMATA; --  檢視當前mysql的指定庫的指定表的所有列 select * from INFORMATION_SCHEMA.COLUMNS wher

    通過javax.validation.constraints下的註解實現驗證

    @NotNull 使用該註解的欄位的值不能為null,否則驗證無法通過。 實體類程式碼: @Entity @Data public class Person { @Id @GeneratedValue private Integer id; @NotNul

    select * select 的速度對比

    拿WordPress的資料庫做一個對比 SELECT ID,post_title, post_author FROM wp_posts ORDER BY ID LIMIT 100; OK, Time: 0.023000s SELECT * FROM wp_posts ORDER BY ID LIMIT 1

    查詢所有表的

    SELECT USER_TAB_COLS.TABLE_NAME as 表名, UTC.COMMENTS as 表中文名, USER_TAB_COLS.COLUMN_ID as 列序號, USER_TAB_COLS.COLUM

    mysql 設定@@sql_mode 解決查詢非分組裡報錯問題

    1 查詢sql_mode SELECT @@sql_mode; 2 把查詢的值複製黏貼,去掉ONLY_FULL_GROUP_BY,重新設定值 SET @@sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISI