0

我需要一些关于我计划做的项目的帮助。在这个阶段,我正在尝试学习在 Java 中使用 NoSQL 数据库。我有一些看起来像这样的嵌套文档: MongoDB nesting structure

在此处输入图像描述

就像你在图片上看到的那样,我的内在属性是“模型”和“构造”。

现在我需要遍历我的集合中的所有文档,它们的键名是未知的,因为它们是在运行时生成的,当用户输入一些信息时。

最后,我需要在 TreeView 中列出它们,保持它们在数据库中已有的结构。我尝试的是从文档中获取 keySets,但我无法通过结构的第二层。我能够以 Json 格式打印整个对象,但我无法访问特定属性,如“模型”或“构造”。

MongoCollection collection= mongoDatabase.getCollection("test");           
MongoCursor<Document> cursor = collection.find().iterator();
for(String keys: document.keySet()) {
                Document vehicles = (Document) document.getString(keys);

                //System.out.println(keys);
                //System.out.println(document.get(keys));
            }

                /Document cars = (Document) vehicle.get("cars");
                Document  types = (Document) cars.get("coupes");
                Document brands = (Document) types.get("Ford");
                Document model = (Document) brands.get("Mustang GT");

在这里,我尝试通过硬编码文档的键名来获取一些属性,但我似乎也无法获得任何值。它一直告诉我它无法从车辆中读取,因为它是空的。

论坛中最多的教程和帖子,不知何故对我不起作用。我不知道他们是否有任何其他版本的 MongoDB 驱动程序。我的是:mongodb驱动程序3.12.7。如果这对您有任何帮助。

我现在正试图让这个工作好几天,这让我发疯。我希望有任何人能够帮助我解决这个问题。

4

2 回答 2

0

这是您可以尝试使用Document该类的方法的一种方法。您使用该Document#getEmbedded方法导航嵌入(或子文档)文档的路径。

try (MongoCursor<Document> cursor = collection.find().iterator()) {
    while (cursor.hasNext()) {
    
        // Get a document
        Document doc = (Document) cursor.next();
        
        // Get the sub-document with the known key path "vehicles.cars.coupes"
        Document coupes = doc.getEmbedded(
                                    Arrays.asList("vehicles", "cars", "coupes"), 
                                    Document.class);
        
        // For each of the sub-documents within the "coupes" get the
        // dynamic keys and their values.
        for (Map.Entry<String, Object> coupe :  coupes.entrySet()) {
        
            System.out.println(coupe.getKey()); // e.g., Mercedes
            
            // The dynamic sub-document for the dynamic key (e.g., Mercedes):
            // {"S-Class": {"model": "S-Class", "construction": "2011"}}
            Document coupeSubDoc = (Document) coupe.getValue(); 
            
            // Get the coupeSubDoc's keys and values
            coupeSubDoc.keySet().forEach(k -> {
                System.out.println("\t" + k); // e.g., S-Class
                System.out.println("\t\t" + "model" + " : " +
                    coupeSubDoc.getEmbedded(Arrays.asList(k, "model"), String.class));
                System.out.println("\t\t" + "construction" + " : " +
                    coupeSubDoc.getEmbedded(Arrays.asList(k, "construction"), String.class));
            });
        }
    }
}

上面的代码打印到控制台:

Mercedes
        S-Class
                model : S-Class
                construction : 2011
Ford
        Mustang
                model : Mustang GT
                construction : 2015
于 2021-02-06T15:46:07.677 回答
0

我认为这不是他问题的完整答案。他在这里说:

现在我需要遍历我的集合中的所有文档,它们的键名是未知的,因为它们是在运行时生成的,当用户输入一些信息时。

你的回答@prasad_ 只是指他在车辆、汽车等方面的情况。我猜他需要一种方法来处理未知的键/值对。例如,在这种情况下,他只知道键:vehicle、cars、coupe、Mercedes/Ford 及其子键。如果另一个用户在集合中插入一些新的键/值对,他将遇到问题,因为他无法浏览新文档而不查看数据库。

我也对该解决方案感兴趣,因为我从未嵌套我的键/值对并且看不到它的优势。我错了还是它使编程更加困难?

于 2021-02-06T18:47:16.827 回答