1

我正在尝试使用 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);

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

谢谢,

埃德

4

2 回答 2

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());
        }
    }

}

希望这可以帮助。

于 2014-07-08T15:58:59.313 回答
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"
于 2014-07-07T16:49:33.947 回答