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