springboot 1.5.2升级2.0.4 mongodb中QueryBuilder中DBObject被弃用,改为Document构造及解决方式

xiaoxiao2022-06-12  35

今天封装mongo工具包,发现QueryBuilder中DBObject被弃用,改为Document构造。为什么,我们稍微分析一下

 Document实现Map,与基本的DBObject相比,可编写的代码更少

DBObject虽然不被推荐,那些从2.x驱动程序系列可能继续使用DBObject接口来表示BSON documents。DBObject与Document类似,它将BSON值表示为Object,但是它有一些无法克服的缺点:

    1. 它是一个接口而不是类,因此如果不打破二进制兼容性,它的API就无法扩展。

    2. 它实际上没有实现Map。

    3. 因为它是一个接口,所以需要一个单独的具体类BasicDBObject,它实现了这个接口

 

但现在遇到一个问题,看下面代码标粗部分,而现在只构造了Document。

我现在没有更好的方式去实现对象的自动根据多条件更新,而QueryBuilder的and实现起来比较方便,但并没有提供getDocument方法,谁有更好的方式请留言

public static void update(List<? extends Object> updateBeans,String queryField,String collectionName) { if(Tools.isEmpty(updateBeans)) return; List<BatchUpParam> list = new ArrayList<>(); try { PropertyUtilsBean pubean = new PropertyUtilsBean(); for(Object up : updateBeans){ BatchUpParam ut = new BatchUpParam(); Update update = new Update(); QueryBuilder qb = new QueryBuilder(); PropertyDescriptor[] descs = pubean.getPropertyDescriptors(up); II: for (int i = 0; i < descs.length; i++) { String name = descs[i].getName(); if (MongoEnum.CLASS_IDENT.getCode().equals(name)) continue II; Object val = pubean.getNestedProperty(up, name); if (null == val) continue II; if(name.equals(queryField)){ qb.and(new BasicDBObject(name,val)); continue II; } update.set(name, val); } ut.setQuery(new BasicQuery(qb.get())); ut.setUpdate(update); list.add(ut); } doBathUpdate(collectionName, list, true); } catch (Exception e) { log.error("bean mapping update error", e); } }

下面是解决方式,翻了一下源码,对Ceria的封装做了些改变,直接通过Query及Criteria实现

private static Query getQueryAnd(Object bean) { BasicDBObject fields = new BasicDBObject(); Query q = new Query(); try { PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean(); PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(bean); II: for (int i = 0; i < descriptors.length; i++) { String name = descriptors[i].getName(); if (MongoEnum.CLASS_IDENT.getCode().equals(name)) continue II; Object val = propertyUtilsBean.getNestedProperty(bean, name); if (null == val || val.equals(0)||val.equals(0L)) continue II; q.addCriteria(Criteria.where(name).is(val)); } return q; } catch (Exception e) { log.error("bean mapping update error", e); } return new Query(); }

 

转载请注明原文地址: https://www.6miu.com/read-4932606.html

最新回复(0)