在上面的MongoDB 3.3.0中使用QueryBuilder和BasicDBObjectBuilder
第1部分
在Mongo 3.3.0中使用QueryBuilder跟踪查询Mongo Collection的解决方案,我尝试实现建议的方法来实现collection.find()
。 但是被不同的参数卡住了,传递了一个BasicDBObjectBuilder
,如下所示 –
BasicDBObjectBuilder queryBuilder = BasicDBObjectBuilder.start(); query.getParams().entrySet().stream().forEach(entry -> queryBuilder.add(entry.getKey(), entry.getValue())); BasicDBObjectBuilder outputQuery = BasicDBObjectBuilder.start(); outputQuery.add(nameKey, 1);
这不编译:
FindIterable tDocTypeList = collection.find(queryBuilder.get(), outputQuery.get());
这也不会编译:
FindIterable tDocTypeList = collection.find((Bson)queryBuilder.get(), (Bson)outputQuery.get());
这也不会编译:
org.bson.Document queryBuilder = new org.bson.Document(); query.getParams().entrySet().stream().forEach(entry -> queryBuilder.put(entry.getKey(), entry.getValue())); org.bson.Document outputQuery = new org.bson.Document(); outputQuery.put(nameKey, 1); FindIterable tDocTypeList = collection.find(queryBuilder, outputQuery);
问题 – 如何从集合中指定
find()
所需结果的projection
?
第2部分
在一端我可以简单地替换mongo 3.0.4 java驱动程序的代码 –
DBObject dbObject = collection.findOne(new QueryBuilder().put(ids).is(id).get())
至
Bson filter = Filters.eq(ids, id); TDocType doc = collection.find(filter).first();
现在,如果我们有一个实现,我们通过迭代构建查询,如示例代码中所示 –
for(Map.Entry entry : query.getParams().entrySet()) { // this is where its building the query if(some condition) { queryBuilder.put(entry.getKey()).is(entry.getValue()); } if(some other condition) { queryBuilder.put(entry.getKey()).in(query.getValues()); } }
问题 – 有没有办法用当前的mongo 3.3.0+实现这样的附加查询filter ?
find方法的第二个参数是结果类型。 请尝试以下方法。
FindIterable tDocTypeList = dbCollection.find(filter, TDocType.class);
更新投影
FindIterable tDocTypeList = dbCollection.find(filter, TDocType.class).projection(outputQuery);
更新附加filter
List filters = new ArrayList<>(); for (Map.Entry entry : query.getParams().entrySet()) { // this is where its building the query if (some condition){ filters.add(Filters.eq(entry.getKey(), entry.getValue())); } if (some other condition){ filters.add(Filters.in(entry.getKey(), query.getValues())); } } FindIterable docType = dbCollection.find(Filters.and(filters));