在上面的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));