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

今天封装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();
}

猜你喜欢

转载自blog.csdn.net/wudaoshihun/article/details/83317491