MongoDB 3.3.0 以上的 QueryBuilder 和 BasicDBObjectBuilder 用法
QueryBuilder and BasicDBObjectBuilder usage in MongoDB 3.3.0 above
第 1 部分
跟进 的解决方案
,我尝试实施建议的方法来实施 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<TDocType> tDocTypeList = collection.find(queryBuilder.get(), outputQuery.get());
这也不会编译:
FindIterable<TDocType> 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<TDocType> tDocTypeList = collection.find(queryBuilder, outputQuery);
Question - How do I specify a projection
for the results required out of find()
from collections?
第 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<String, Object> 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());
}
}
Question - Is there a way to implement such appending query Filters
with current mongo 3.3.0+ as well?
find方法的第二个参数是结果类型。尝试如下。
FindIterable<TDocType> tDocTypeList = dbCollection.find(filter, TDocType.class);
投影更新
FindIterable<TDocType> tDocTypeList = dbCollection.find(filter, TDocType.class).projection(outputQuery);
附加过滤器的更新
List<Bson> filters = new ArrayList<>();
for (Map.Entry<String, Object> 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<TDocType> docType = dbCollection.find(Filters.and(filters));
第 1 部分
跟进 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<TDocType> tDocTypeList = collection.find(queryBuilder.get(), outputQuery.get());
这也不会编译:
FindIterable<TDocType> 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<TDocType> tDocTypeList = collection.find(queryBuilder, outputQuery);
Question - How do I specify a
projection
for the results required out offind()
from collections?
第 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<String, Object> 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());
}
}
Question - Is there a way to implement such appending query Filters with current mongo 3.3.0+ as well?
find方法的第二个参数是结果类型。尝试如下。
FindIterable<TDocType> tDocTypeList = dbCollection.find(filter, TDocType.class);
投影更新
FindIterable<TDocType> tDocTypeList = dbCollection.find(filter, TDocType.class).projection(outputQuery);
附加过滤器的更新
List<Bson> filters = new ArrayList<>();
for (Map.Entry<String, Object> 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<TDocType> docType = dbCollection.find(Filters.and(filters));