1. 程式人生 > >springboot 1.5.2升級2.0.4 mongodb中QueryBuilder中DBObject被棄用,改為Document構造及解決方式

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(); }