使用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?Spring?Dubbo三種SPI機制的區(qū)別
這篇文章主要介紹了Java?Spring?Dubbo三種SPI機制的區(qū)別,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-08-08java實現(xiàn)簡單學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細介紹了java實現(xiàn)簡單學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02struts2數(shù)據(jù)處理_動力節(jié)點Java學(xué)院整理
Struts2框架框架使用OGNL語言和值棧技術(shù)實現(xiàn)數(shù)據(jù)的流轉(zhuǎn)處理。下面通過本文給大家分享struts2數(shù)據(jù)處理的相關(guān)知識,感興趣的朋友參考下吧2017-09-09