欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用mongoTemplate實現(xiàn)多條件加分組查詢方式

 更新時間:2022年06月30日 10:59:08   作者:intomylife  
這篇文章主要介紹了使用mongoTemplate實現(xiàn)多條件加分組查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

先來一個常見的錯誤信息:

Due to limitations of the com.mongodb.BasicDocument, you can't add a second '$and' expression specified as '$and : 

錯誤原因:

在一個 Criteria 對象中調(diào)用了多次 andOperator() 方法

mongoTemplate實現(xiàn)多條件查詢

多個條件的查詢只需要創(chuàng)建 Query 對象,然后把需要添加的條件使用 Query 對象的 addCriteria() 方法

// 場景:查詢指定時間段內(nèi),狀態(tài)為1的數(shù)據(jù)
// 入?yún)l件 :beginTime ,endTime ,statue
// mongodb字段:time , state
 
// 存放條件的對象
Query condition= new Query();
 
// 判斷時間是否為空
if(beginTime != null && endTime != null){
    // 添加大于開始時間小于結(jié)束時間的條件
    condition.addCriteria(Criteria.where("time").gte(beginTime).lte(endTime));
}else{
    // 其中一個為空 分別進行判斷
    if(beginTime != null){
        condition.addCriteria(Criteria.where("time").gte(beginTime));
    }
    if(endTime != null){
        condition.addCriteria(Criteria.where("time").lte(endTime));
    }
}
 
// 添加狀態(tài)為1條件
if(statue!=null){
    condition.addCriteria(Criteria.where("state").is(statue));
}

條件有了后再調(diào)用 mongoTemplate.find(condition,返回類型.class,collectionName)

但是...想要分組,得調(diào)用 mongoTemplate.group(Criteria criteria , String inputCollectionName , GroupBy groupBy , Class<T> entityClass) 方法 (不是說只能這樣才能分組,而是我通過這種方法實現(xiàn)了分組查詢)

朋友們,第一個參數(shù)條件只能入?yún)?nbsp;Criteria 對象,而不能入?yún)?nbsp;Query 對象

結(jié)果我發(fā)現(xiàn) Criteria 對象有 andOperator(Criteria ... criteria) 方法

這個方法就厲害了,可以入?yún)?shù)組,也就是說

我們可以把查詢條件先存放到一個集合里面(因為數(shù)組需要定義長度,如果條件個數(shù)不確定,就不能直接定義數(shù)組),然后把集合放入數(shù)組中,再把數(shù)組入?yún)?nbsp;andOperator(Criteria ... criteria) 方法

// 場景:查詢指定時間段內(nèi),狀態(tài)為1的數(shù)據(jù)
// 入?yún)l件 :beginTime ,endTime ,statue
// mongodb字段:time , state
 
// 定義一個存放條件的集合
List<Criteria> criteriaList = new ArrayList<>();
// 定義一個存放條件的數(shù)組(暫時不給長度)
Criteria[] criteriaArray = {};
 
// 判斷時間是否為空
if(beginTime != null && endTime != null){
    // 添加大于開始時間小于結(jié)束時間的條件
    Criteria between = Criteria.where("time").gte(beginTime).lte(endTime);
    criteriaList.add(between);
}else{
    // 其中一個為空 分別進行判斷
    if(beginTime != null){
        Criteria gte = Criteria.where("time").gte(beginTime);
        criteriaList.add(gte);
    }
    if(endTime != null){
        Criteria lte = Criteria.where("time").lte(endTime);
        criteriaList.add(lte);
    }
}
 
// 添加狀態(tài)為1條件
if(statue!=null){
    Criteria isState = Criteria.where("state").is(statue);
    criteriaList.add(isState);
}
 
// 如果有條件
if(criteriaList.size()>0){
  // 集合的個數(shù)就是數(shù)組的長度
  criteriaArray = new Criteria[criteriaList.size()];
  // 遍歷添加到數(shù)組中
  for(int i = 0 ; i<criteriaList.size(); i++){
      criteriaArray[i] = criteriaList.get(i);
   }
}
 

這種就可以調(diào)用 mongoTemplate.group(Criteria criteria , String inputCollectionName , GroupBy groupBy , Class<T> entityClass) 方法進行分組查詢了

 GroupBy groupBy = new GroupBy("分組字段")
                    .initialDocument("{ count: 0 }")
                    .reduceFunction("function (doc,pre){pre.count +=1 ;}");
 
// new Criteria().andOperator(criteriaArray) 這個是很關(guān)鍵的一步操作,把剛剛的條件數(shù)組放入進入
// groupByResults 這個對象里面內(nèi)容很多,有興趣的朋友可以斷點進入看一下
GroupByResults groupByResults = mongoTemplate.
                    group(new Criteria().andOperator(criteriaArray), mongodb的collectionName, groupBy, 實體類.class);
// 獲取分組后的數(shù)量
long resultCount = ((List)groupByResults.getRawResults().get("retval")).size();

mongoTemplate分組查詢的坑

Aggregation agg = Aggregation.newAggregation(
? ? ? ? ? ? ? ? Aggregation.match(new Criteria().orOperator(new Criteria("to").is(ukey), new Criteria().and("fromAccount").is(ukey))),
? ? ? ? ? ? ? ? Aggregation.sort(Sort.Direction.DESC,"_id"),
? ? ? ? ? ? ? ? Aggregation.group("to","fromAccount")
? ? ? ? );

Aggregation.group 要排在Aggregation.match后面,否則結(jié)果集不準(zhǔn)確。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java設(shè)計模式之策略模式

    Java設(shè)計模式之策略模式

    這篇文章介紹了Java設(shè)計模式之策略模式,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • 舉例講解Java設(shè)計模式中的對象池模式編程

    舉例講解Java設(shè)計模式中的對象池模式編程

    這篇文章主要介紹了Java設(shè)計模式中的對象池模式編程示例分享,對象池模式經(jīng)常在多線程開發(fā)時被用到,需要的朋友可以參考下
    2016-02-02
  • Java?Spring?Dubbo三種SPI機制的區(qū)別

    Java?Spring?Dubbo三種SPI機制的區(qū)別

    這篇文章主要介紹了Java?Spring?Dubbo三種SPI機制的區(qū)別,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-08-08
  • JavaGUI常用窗體組件與面板使用詳解

    JavaGUI常用窗體組件與面板使用詳解

    GUI即圖形用戶界面,它是基于圖形的界面,windows就是一個圖形用戶界面的操作系統(tǒng),而DOS是基于命令提示符的操作系統(tǒng),GUI編程就是編出一個圖形用戶界面的軟件,它使用圖形的方式,以菜單、按鈕、表示、圖文框等標(biāo)準(zhǔn)界面元素組成的用戶操作界面
    2023-03-03
  • java常用工具類之Excel操作類及依賴包下載

    java常用工具類之Excel操作類及依賴包下載

    這篇文章主要介紹了java常用工具類Excel操作類及依賴包下載,需要的朋友可以參考下
    2014-07-07
  • java實現(xiàn)簡單學(xué)生成績管理系統(tǒng)

    java實現(xiàn)簡單學(xué)生成績管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 聊聊注解@Aspect的AOP實現(xiàn)操作

    聊聊注解@Aspect的AOP實現(xiàn)操作

    這篇文章主要介紹了聊聊注解@Aspect的AOP實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • struts2數(shù)據(jù)處理_動力節(jié)點Java學(xué)院整理

    struts2數(shù)據(jù)處理_動力節(jié)點Java學(xué)院整理

    Struts2框架框架使用OGNL語言和值棧技術(shù)實現(xiàn)數(shù)據(jù)的流轉(zhuǎn)處理。下面通過本文給大家分享struts2數(shù)據(jù)處理的相關(guān)知識,感興趣的朋友參考下吧
    2017-09-09
  • springboot項目之相互依賴報錯問題(基于idea)

    springboot項目之相互依賴報錯問題(基于idea)

    這篇文章主要介紹了springboot項目之相互依賴報錯問題(基于idea),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java爬蟲Gecco工具抓取新聞實例

    java爬蟲Gecco工具抓取新聞實例

    本篇文章主要介紹了JAVA 爬蟲Gecco工具抓取新聞實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-10-10

最新評論