springboot 1.5.2升級2.0.4 mongodb中QueryBuilder中DBObject被棄用,改為Document構造及解決方式
阿新 • • 發佈:2018-11-20
今天封裝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(); }