语言基础_Mongo开发常见用法(基础篇)

一、介绍

1、记录一些实际开发经常用到的用法

2、公司在平台开发过程中用到的一些复杂查询场景(持续更新)

二、特性

1、由于mongo是半结构化的文档型内存数据库,一般性能方面会比mysql更快,但日常开发依旧是遵循mysql的基本开发规范。一方面是统一人为习惯,一方面是最大程度地去突显mongo的特性用法,而不是为了方便字段的随便扩张而使用。mongo在文档型的存储具有很大的优势,一般都会用于存储文章或者特殊的JSON内容。

三、细节

#简单查询

Query policyQuery = new Query(Criteria.where("delFlag").is(0).and("status").is("on").and("_id").in(chanDoc.getPolicyCode()));

说明1: 实际上开发过程我们是基于责任链模式封装编程框架,利用反射动态解析对象参数。使得正常调度和开发与常规的Java编程契合。除此之外也会封装一些通用技术!

#转Map查询

        Map<String,VmLetTaskParamDocument> pkgMap = pkglist.stream().collect(Collectors.toMap(VmLetTaskParamDocument::getTaskContentType,a->a));

#分组转Map

Map<String, List<PolicyDocument>> policyMap = policyDoc.stream().distinct().collect(Collectors.groupingBy(PolicyDocument::getBatchPkgType));

#以记录里面的Map里面的key作为查询条件

Criteria firstCriteria = Criteria.where("delFlag").is(0).and("labels");
            Criteria  criteria = new Criteria();
            Set<Map.Entry<String,String>> labelSet  = policyLabels.entrySet();
            for (Map.Entry<String,String>  entry:labelSet){
                if (Objects.isNull(entry.getValue())){
                    criteria.and(entry.getKey()).exists(true);//判断元素存在即可
                }else{
                    criteria.and(entry.getKey()).is(entry.getValue());//存在且值相等
                }
            }
            //2、查找包
            firstCriteria.elemMatch(criteria);//内元素查询
            List<VmLetTaskParamDocument>  list=vmLetTaskParamRepository.selectTaskParamByList(new Query(firstCriteria));

#简单模糊查询

        if (StringUtils.isNotBlank(request.getInstanceName())) {
            query.addCriteria(Criteria.where("instanceName").regex("^.*" + request.getInstanceName() + ".*$"));
        }

#将对象转化为Map

    /**
     * 20211223---将将对象里面值为非空的属性加入Map中
     */
    public static Map<String, Object> objectToMap(Object obj) {
        Map<String, Object> map = Maps.newHashMap();
        Class<?> clazz = obj.getClass();
        try {
            for (Field field : clazz.getDeclaredFields()) {
                field.setAccessible(true);
                String fieldName = field.getName();
                Object value = field.get(obj);
                if (Objects.nonNull(value)) {
                    Id check = field.getAnnotation(Id.class);
                    if (Objects.nonNull(check)) {
                        map.put("_id", value);
                    } else {
                        map.put(fieldName, value);
                    }

                }
            }
        } catch (IllegalAccessException e) {
            log.info("对象非空值转化为属性出现异常:[{}]", e);
        }
        log.info("查询参数:" + map);
        return map;
    }

#将Map转化为Query

 /**
     * 20211214---将Map中的[key:value]映射成为查询
     */
    protected Query setParamFromMap(Map<String, Object> paramMap) {
        Query query = new Query();
        if (MapUtil.isEmpty(paramMap)) {
            return query;
        }
        paramMap.forEach((paramKey, paramValue) -> {
            if (Objects.isNull(paramKey) || Objects.isNull(paramValue)) {
                return;
            }

            if (paramValue.getClass().equals(String.class)) {
                query.addCriteria(Criteria.where(paramKey).is(paramValue));
            }

            if (paramValue.getClass().equals(Integer.class)) {
                query.addCriteria(Criteria.where(paramKey).is(paramValue));
            }

            if (paramValue.getClass().isArray()) {
                query.addCriteria(Criteria.where(paramKey).in(paramValue));
            }

            if (paramValue.getClass().equals(ArrayList.class) || paramValue.getClass().equals(List.class)) {
                List  list = (List) paramValue;
                query.addCriteria(Criteria.where(paramKey).in(list));
            }
        });
        return query;
    }

#当你分组后想对分组的list进行操作

版本1(易理解):
List<VmLetProcessInfo> 
list=processList.stream().collect(groupingBy(VmLetProcessInfo::getProcessType,
Collectors.collectingAndThen(Collectors.toList(),valueList ->valueList.get(0)))).values().stream().collect(toList());

版本2(简化):
List<VmLetProcessInfo> list = new ArrayList<>(processList.stream().collect(groupingBy(VmLetProcessInfo::getProcessType,
Collectors.collectingAndThen(Collectors.toList(), valueList -> valueList.get(0)))).values());

#模糊匹配

Criteria.where("metricTargets").regex("^.*" +req.getMetricTargets()+ ".*$")

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值