簡體   English   中英

使用 MongoDB、Java 和 Jongo 創建動態查詢

[英]Creating a dynamic query with MongoDB, Java and Jongo

我正在使用 Java、使用 Java 而不是 Scala、MongoDB 和 Jongo 的 Play 框架作為基本 Web CRUD 應用程序的組合。 即使我的字符串不包含任何非法字符,我也不斷收到 JSON 解析異常。 在語句末尾關閉大括號實際上是失敗的。 下面是我的錯誤和代碼。 查詢字符串只是一個字符串構建器,搜索對象是否為空或有值,如果有值則將其附加到字符串。

鍾哥法:

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"}
                                                                                          ^

以“}”結尾的錯誤結束。

除此之外,如果我嘗試通過放入 \\" 來轉義字符,使其變為 \\"date\\" 它將解析並出錯,如下所示:

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

我真的可以這樣做還是因為它插入了 Java,引號將圍繞整個字符串,因此它試圖將其作為單個 JSON 字段讀取,而不是整個查詢?


首先,確保不要讓自己容易受到注入攻擊 閱讀一般的注入攻擊,更具體地說是關於 MongoDB,例如NoSQL 注入測試的 OWASP 頁面


雖然您確實可以將生成的查詢字符串傳遞到 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

找到了答案。 需要刪除替換,而是我的方法看起來像

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM