0

我有一个从 MongoDB 检索 bson.Document 的 java 代码。JSON/BSON 文档示例如下:

{
    "field1": "text1",
    "field2": {
        "field2Sub1": "text2"
    }
}

在我的java代码中,我像这样操作它来获取field1field2Sub1

com.fasterxml.jackson.databind.ObjectMapper objectMapper;

org.bson.Document documentFromMongo = this.getDocumentFromMongo();
org.bson.Document field2Document = documentFromMongo.get("field2", Document.class);

String field1Value = objectMapper.convertValue(documentFromMongo.get("field1"), String.class);
String field2Sub1Value = objectMapper.convertValue(field2Document.get("field2Sub1"), String.class);

有什么方法或一些库或方法可以用来获取 field2Sub1 的值,如下所示:

String field1Value = objectMapper.convertValue(documentFromMongo.get("field2.field2Sub1"), String.class);
4

1 回答 1

1

我不知道另一个库这样做,但您可以使用org.bson.Document提供的功能来实现类似的效果。这很简单

  1. 按点拆分您的输入/路径
  2. 利用Document.getEmbedded()

像这样:

public class MongoMain {

    private static final String JSON = "{\n" +
            "    \"field1\": \"text1\",\n" +
            "    \"field2\": {\n" +
            "        \"field2Sub1\": \"text2\"\n" +
            "    }\n" +
            "}";

    public static void main(String[] args) {
        Document document = Document.parse(JSON);
        String path = "field2.field2Sub1";
        String value = extractValue(document, path);
        System.out.println("extracted value - " + value);
    }

    private static String extractValue(Document document, String dotNotationPath) {
        List<String> path = Arrays.asList(dotNotationPath.split("\\."));
        return document.getEmbedded(path, String.class);
    }
}

extractValue方法可以解决问题 - 首先按点拆分并构建一个列表,因为getEmbedded接受一个列表,然后getEmbedded处理其余部分。

于 2022-02-24T08:25:00.193 回答