使用MongoDB,Java和Jongo创建动态查询

时间:2014-08-21 19:31:21

标签: java json mongodb jongo

我使用Java,Play框架使用Java而不是Scala,MongoDB和Jongo作为基本Web CRUD应用程序的组合。我一直收到一个JSON解析异常,即使我的字符串不包含任何非法字符。它实际上在声明结尾处没有关闭花括号。以下是我的错误和代码。查询字符串只是一个字符串构建器,搜索对象是否为空或具有值,如果它具有附加到字符串的值。

Jongo方法:

public static Iterable<OneDomain> findWithQueryString(String queryString){
    return domains().find("{#}", queryString).as(OneDomain.class);
}

控制器方法: 字符串构建器示例:

        if(queryStringBuilder.toString().equalsIgnoreCase("")){
            queryStringBuilder.append("date: {$gte : " + searchObj.dateFrom + ", $lt: " + searchObj.dateTo + "}");
        }else{
            queryStringBuilder.append(" , ");
            queryStringBuilder.append("date: {$gte : " + searchObj.dateFrom + ", $lt: " + searchObj.dateTo + "}");
        }

        String queryString = queryStringBuilder.toString();

        Iterable<OneDomain> filteredIterable = OneDomain.findWithQueryString(queryString);

给我这个错误:

   Caused by: com.mongodb.util.JSONParseException:
   {"source : Online Lists , blacklist : true , vetted : true , is : false , isNot : true"}
                                                                                          ^

错误在&#34;}&#34;结束它。

除此之外,如果我试图通过放入\&#34;来逃避角色。所以它变成\&#34; date \&#34;它会像这样解析和错误:

   Caused by: com.mongodb.util.JSONParseException:
   {"\"source\" : \"Online Lists\" , \"blacklist\" : true , \"vetted\" : true , \"is\" : false , \"isNot\" : true"}

我可以实际执行此操作,或者因为它的Java被插入其中,引号将围绕整个字符串,因此它尝试将其作为单个JSON字段读取而不是整个字符串查询?

2 个答案:

答案 0 :(得分:3)

虽然你确实可以将生成的查询字符串传递给find方法,但我不建议它。当我们生成包含jongo替换参数的查询时,我也做了同样的问题并且遇到了很大问题,即

// This will throw an exception:
// java.lang.IllegalArgumentException: Not enough parameters passed to query: {"value":"#"}
...find("{" + "\"value\":\"#\"" + "}")

我的解决方案是传递DBObject:

import com.mongodb.BasicDBObject
...find("#", new BasicDBObject().append("value", "#"))

它也可以使用QueryBuilder构建:

import com.mongodb.QueryBuilder
...find("#", QueryBuilder.start("value").is("#").get())

尽管在Jongo API中直接使用查询构建器支持会很好:https://github.com/bguerout/jongo/issues/173

答案 1 :(得分:0)

找到答案。需要删除替换,而我的方法看起来像

domains().find("{"+queryString+"}").as(OneDomain.class);