MongoDb和Jongo - 在字段中转义哈希(#)

时间:2014-07-07 11:05:58

标签: jackson jongo

我尝试使用Jackson / Jongo读取已保存在MongoDB中的数据并将其反序列化为POJO。当字段不包含哈希时,这可以正常工作。当字段包含哈希时,Jongo认为这是一个占位符,因此期望另一个对象替换它。

例如...... Person ed = collection.findOne("{name:\"ed\"}").as(Person.class); ..工作正常。

然而.. Sale s = collection.findOne("{orderRef:\"#1000\"}").as(Sale.class); ..不起作用。

我尝试传递哈希作为参数,但这仍然失败。例如: Sale s = collection.findOne("{orderRef:\"#1000\"}", "#").as(Sale.class);

有没有其他人有过这个问题的经验?任何帮助都会有很大的帮助!

谢谢,

2 个答案:

答案 0 :(得分:2)

如果您想查找带有#1000值的订单参考,请尝试以下操作:

Sale s = collection.findOne("{orderRef:#}", "#1000").as(Sale.class);

#字符恰好是变量值的占位符。 Jongo有一个内置模板系统,可以为您进行基本的查询清理。此模板系统将扫描查询字符串中的#字符,并将其替换为您放置的参数的已清理版本。由于在您的情况下,#位于字段值中,而不是字段名称,因此您不需要任何特殊处理。这是一个更加展开的工作原理示例。

public class JongoTest {

    public static void main(String[] args) throws Exception {

        // initialize mongo
        MongoClient mongoClient = new MongoClient("localhost", 27017);
        DB db = mongoClient.getDB("test");
        Jongo jongo = new Jongo(db);

        // create a simple object here
        Map<String, Object> pojo = new LinkedHashMap<>();
        pojo.put("artist", "The Chainsmokers");
        pojo.put("title", "#selfie");
        pojo.put("timestamp", System.currentTimeMillis());

        // save the result in the system
        jongo.getCollection("test").save(pojo);

        // perform query and print the result
        Iterable<Object> iterator = jongo.getCollection("test").find("{title:#}", "#selfie").as(Object.class);
        for (Object dbResult : iterator) {
            System.err.println(dbResult.toString());
        }
    }

}

希望这有帮助。

答案 1 :(得分:0)

我没有遇到过这个问题而且我只听说过必须在密钥中转换美元符号和句点...但是你可以对任何可能包含#字符的属性值进行URI编码/解码:

String value = "#1000";
String orderRef = String.format("{orderRef: \"%s\"}", URLEncoder.encode(value, "UTF-8"));

您不希望对整个JSON字符串进行编码,因为这会对重要的JSON语法位进行编码,例如括号和冒号。

解码非常相似:

String encodedOrderRefValue = "%231000";
String decoded = URLDecoder.decode(encodedOrderRefValue, "UTF-8"); // returns "#1000"