Morphia - 将复杂查询与复杂条件合并

时间:2017-01-05 09:22:10

标签: mongodb morphia

我正在使用setQueryObject方法将过滤器从客户端转换为QueryImpl。 当我尝试向该查询添加另一个复杂条件时,我的原始查询将移动到名为baseQuery的字段,新条件是查询字段。 执行查询时,仅使用新条件并且不使用baseQuery。 它只发生在客户端查询的格式如下:{" $或" :[{" field1" :{" $ regex" :" value1"," $ options" :"我"}},...]} 并且新标准的格式相同(表示$或操作)。 似乎当我尝试合并2 $或查询时,它会发生,但是当我合并$或$时,它会正确地连接查询。 我使用它错了还是真正的错误? 编辑: 代码:

public static List<Entity> getData(client.Query query) {
QueryImpl<Entity> finalQuery = Morphia.realAccess().extractFromQuery(Entity.class,query);
finalQuery.and(finalQuery.or(finalQuery.criteria("field").equal(false), finalQuery.criteria("field").doesNotExist()));
return finalQuery.asList();
}

public <E> QueryImpl<E> extractFromQuery(Class<E> clazz, client.Query query) {
    QueryImpl<E> result = new QueryImpl<E>(clazz,this.db.getCollection(clazz),this.db);
result.setQueryObject(query.getFiltersAsDBObject);
return result;
}

2 个答案:

答案 0 :(得分:0)

QueryImplsetQueryObject()是内部构造。你真的不应该使用它们,因为它们可能会在没有警告的情况下改变或消失。您应该使用公共查询构建器API来构建查询文档。

答案 1 :(得分:0)

我遇到了同样的问题,当我这样做时似乎正在工作: finalQuery.and(); finalQuery.and(finalQuery.or(finalQuery.criteria(“field”)。equal(false),finalQuery.criteria(“field”)。doesNotExist())); 它有点难看,如果有人有不同的方法,我很乐意听到,但是我能够找到从客户端转换数据的唯一方法就是使用QueryImpl的setQueryObject()。