一、介绍
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()+ ".*$")