mongodb查询的结果排序

前段时间做动态导出Excel(导出字段可选),要对导出的字段进行排序,由于要先去pgsql进行查询,然后映射成表名和条件再去mongodb再查询,这样会出现一个问题:在pgql查询的时候是有序的,但是在去mongodb查询的时候完毕,结果就没有顺序了,但是,最终导出要按字段排序,怎么办呢?后来自己写了工具类进行实现。

注意事项:要用LinkedHashMap

import org.apache.commons.lang.StringUtils;
import java.util.*;
public class ListUtils {
   
    public static void mergeListByStringValue(List list, String condKey,String... mergeKey){
        if(isNotEmpty(list)){
            for (int i = 0; i < list.size()-1; i++) {
                Map temp = (Map) list.get(i);
                for (int j = i+1; j < list.size(); j++) {
                    if(temp.get(condKey)!=null && temp.get(condKey).equals(((Map)list.get(j)).get(condKey))){
                        mergerMap(temp,(Map)list.get(j),mergeKey);
                        list.remove(j);
                        j--;
                    }
                }
            }
        }
    }

   
    public static void mergerMap(Map map1, Map map2, String... mergeKey) {
        for (int i = 0; i < mergeKey.length; i++) {
            int count1 =  map1.get(mergeKey[i]) == null ? 0 : (int)map1.get(mergeKey[i]);
            int count2 =  map2.get(mergeKey[i]) == null ? 0 : (int)map2.get(mergeKey[i]);
            map1.put(mergeKey[i],count1 + count2);
        }
    }

   
    public static void mergeListWhenIsNull(List list, String condKey,
                                           String condValue,String... mergeKey){
        if(isNotEmpty(list)){
            boolean flag = false;
            Map temp = new HashMap();
            temp.put(condKey,condValue);
            for (int i = 0; i < list.size(); i++) {
                Map map = (Map) list.get(i);
                if(condValue.equals(map.get(condKey))
                        || StringUtils.isBlank((String) map.get(condKey))){
                    mergerMap(temp,map,mergeKey);
                    list.remove(i);
                    i--;
                    flag = true;
                }
            }
            if(flag){
                list.add(temp);
            }
            mergeListByStringValue(list,condKey,mergeKey);
        }
    }

   
    public static void sortByKey(List list,final String sortKey){
        if(isNotEmpty(list)){
            Collections.sort(list, new Comparator() {
                @Override
                public int compare(Map map1, Map map2) {
                    return Integer.parseInt(String.valueOf(map2.get(sortKey)))
                            - Integer.parseInt(String.valueOf(map1.get(sortKey)));//倒序排列
                }
            });
        }
    }

   
    public static void sortByObjectKey(List list,final String sortKey, final String orderType){
        if(isNotEmpty(list)){
            Collections.sort(list, new Comparator() {
                @Override
                public int compare(Map map1, Map map2) {
                    if("desc".equalsIgnoreCase(orderType)){
                        return String.valueOf(map2.get(sortKey)).compareTo(String.valueOf(map1.get(sortKey)));//倒序排列
                    }else {
                        return String.valueOf(map1.get(sortKey)).compareTo(String.valueOf(map2.get(sortKey)));//升序排列
                    }
                }
            });
        }
    }

   
    public static void mergeTwoListByKey(List list1,List list2,
                                         String condKey,String condValue,String... mergeKey){
        mergeListWhenIsNull(list1,condKey,condValue,mergeKey);
        mergeListWhenIsNull(list2,condKey,condValue,mergeKey);
        if(isNotEmpty(list1) && isNotEmpty(list2)){
            for (int i = 0; i < list1.size(); i++) {
                Map map1 = (Map) list1.get(i);
                for (int j = 0; j < list2.size(); j++) {
                    Map map2 = (Map) list2.get(j);
                    if(map1.get(condKey) != null && String.valueOf(map1.get(condKey)).equals(map2.get(condKey))){
                        mergerMap(map1,map2,mergeKey);
                        list2.remove(j);
                        break;
                    }
                }
            }
            if(isNotEmpty(list2)){
                list1.addAll(list2);
            }
        }
    }

    public static boolean isEmpty(List list){
        return list == null || list.isEmpty();
    }

    public static boolean isNotEmpty(List list){
        return list != null && !list.isEmpty();
    }

    public static void putIfNotContains(List list,Object o){
        if(!list.contains(o) && o != null && !"".equals(o)){
            list.add(o);
        }
    }

    public static Map mergeField(Listlist,String key1,String key2){
        Map result = new HashMap();
        if(isNotEmpty(list)){
            for (int i = 0; i < list.size(); i++) {
                Map temp = list.get(i);
                result.put(temp.get(key1),temp.get(key2));
            }
        }
        return result;
    }

    public static List getSubList(List list,int start,int limit){
        if(isEmpty(list)){
            return null;
        }
        if(start >= list.size()){
            return null;
        }
        int end = start + limit;
        if(end >= list.size()){
            end  = list.size();
        }
        return list.subList(start,end);
    }

    public static List addAllDistinctArrayData(String[] arr1, String[] arr2) {
        List list = new ArrayList<>();
        if(arr1 != null){
            for (int i = 0; i < arr1.length; i++) {
                putIfNotContains(list,arr1[i]);
            }
        }
        if(arr2 != null){
            for (int i = 0; i < arr2.length; i++) {
                putIfNotContains(list,arr2[i]);
            }
        }
        return list;
    }

    public static Listdistinct(ListusedRulesetList, String key) {
        if(isEmpty(usedRulesetList)){
            return usedRulesetList;
        }
        ListkeyList = new ArrayList<>();
        for (int i = 0; i < usedRulesetList.size(); i++) {
            Map map = usedRulesetList.get(i);
            if(keyList.contains(map.get(key))){
                usedRulesetList.remove(i);
                i--;
            }else {
                keyList.add(map.get(key));
            }
        }
        return usedRulesetList;
    }

   
    public static void addListIfNotExists(List list, Object o){
        if(list!=null && !list.contains(o)){
            list.add(o);
        }
    }

}

2.在封装的时候调用

  //list转换成map
    private Map<String, List<String>> result(List<Map> list) {
        //这里必须用LinkedHashMap
        Map<String, List<String>> streamCond = new LinkedHashMap<>();
        for (Map<String, Object> map : list) {
            String app_id = TypeUtils.castToString(map.get("app_id"));
            String scenario_name = (String) map.get("scenario_name");
            String collName = app_id + "_" + scenario_name;
            if (streamCond.get(collName) == null) {
                List<String> eventIds = new ArrayList<>();
                eventIds.add((String) map.get("event_id"));
                streamCond.put(collName, eventIds);
            } else {
                List<String> eventIds = streamCond.get(collName);
                eventIds.add((String) map.get("event_id"));
            }
        }
        return streamCond;
    }

    private List<Map> addCulomn(Map<String, Map> pgMap, List<Map> resultSet) {
            if (ListUtils.isEmpty(resultSet)) {
             return resultSet;
        }
        String[] codeConvert = new String[]{"certificate_type",};
        String[] parentCodes = new String[]{"certificate_type",};
        for (Map<String, Object> map : resultSet) {
            String key = (String) map.get("_id");
            for (int i = 0; i < codeConvert.length; i++) {
                // logger.info("转码开始,key:{},parentCode:{},value:{}", codeConvert[i], parentCodes[i],         map.get(codeConvert[i])+""); map.put(codeConvert[i], dictionaryDAOImpl.findDicDesc(parentCodes[i],                 map.get(codeConvert[i])+""));
            }
            map.put("description", pgMap.get(key).get("description"));
            map.put("case_findings", pgMap.get(key).get("case_findings"));
            //根据时间排序:occur_time
            ListUtils.sortByObjectKey(resultSet, "occur_time", "desc");
        }
        return resultSet;
    }

猜你喜欢

转载自blog.csdn.net/qq_40428665/article/details/85037080