最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用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){
    // 添加大于開始時間小于結束時間的條件
    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 對象

結果我發(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){
    // 添加大于開始時間小于結束時間的條件
    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) 這個是很關鍵的一步操作,把剛剛的條件數(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后面,否則結果集不準確。

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

相關文章

  • springboot攔截器Interceptor的使用,你都了解嗎

    springboot攔截器Interceptor的使用,你都了解嗎

    springmvc 中的攔截器可以對請求進行判別,在請求到達控制器之前,把非法的請求給攔截掉下面來說一說, 它在springboot中的使用,感興趣的朋友一起看看吧
    2021-07-07
  • 在Spring boot的項目中使用Junit進行單體測試

    在Spring boot的項目中使用Junit進行單體測試

    今天小編就為大家分享一篇關于spring boot使用Junit進行測試,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java數(shù)組常見應用詳解【創(chuàng)建、遍歷、排序、查找】

    Java數(shù)組常見應用詳解【創(chuàng)建、遍歷、排序、查找】

    這篇文章主要介紹了Java數(shù)組常見應用,結合實例形式詳細分析了java數(shù)組的基本定義、創(chuàng)建、遍歷、排序、查找等相關操作技巧與使用注意事項,需要的朋友可以參考下
    2020-02-02
  • 公司一般使用的分布式RPC框架及其原理面試

    公司一般使用的分布式RPC框架及其原理面試

    這篇文章主要為大家介紹了公司一般使用的分布式RPC框架及其原理的面試問題解答,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-03-03
  • struts2實現(xiàn)文件下載功能

    struts2實現(xiàn)文件下載功能

    這篇文章主要為大家詳細介紹了struts2實現(xiàn)文件下載功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Spring Cloud Alibaba整合Sentinel的實現(xiàn)步驟

    Spring Cloud Alibaba整合Sentinel的實現(xiàn)步驟

    這篇文章主要介紹了Spring Cloud Alibaba整合Sentinel的實現(xiàn)步驟,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Spring手動獲取bean的四種方式

    Spring手動獲取bean的四種方式

    本文主要介紹了Spring手動獲取bean的四種方式,包括BeanFactoryPostProcessor接口,ApplicationContextAware接口,注解 @PostConstruct 初始化時獲取,啟動類ApplicationContext獲取這四種方法,感興趣的可以了解一下
    2024-01-01
  • springboot中redis正確的使用詳解

    springboot中redis正確的使用詳解

    本文主要介紹了springboot中redis正確的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Java實現(xiàn)定時備份文件

    Java實現(xiàn)定時備份文件

    這篇文章主要為大家詳細介紹了Java實現(xiàn)定時備份文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 簡單的理解java集合中的HashSet和HashTree幾個重寫方法

    簡單的理解java集合中的HashSet和HashTree幾個重寫方法

    這篇文章主要介紹了簡單的理解java集合中的HashSet和HashTree幾個重寫方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10

最新評論

永德县| 奉新县| 资溪县| 庆阳市| 武汉市| 通城县| 隆子县| 文昌市| 韶关市| 尉氏县| 霍山县| 无为县| 宁海县| 虞城县| 沙雅县| 岳阳县| 铁力市| 银川市| 梁河县| 吉木乃县| 利川市| 河北区| 彩票| 天津市| 澜沧| 万州区| 银川市| 天等县| 枝江市| 文昌市| 永和县| 三台县| 永靖县| 黑河市| 怀仁县| 贵定县| 盐亭县| 丰台区| 朝阳区| 屯留县| 河西区|