如何从 MongoDB Java 中的多个嵌套文档中读取属性?

How to read attributes out of multiple nested documents in MongoDB Java?

我计划做的项目需要一些帮助。在这个阶段,我正在尝试学习在 Java 中使用 NoSQL 数据库。 我有一些嵌套文档,如下所示: MongoDB nesting structure

如图所示,我的内在属性是“模型”和“构造”。

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

最后我需要将它们列在 TreeView 中,并保持数据库中已有的结构。 我试过的是从文档中获取密钥集,但我无法通过结构的第二层。我能够以 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。如果这对您有任何帮助。

几天来我一直在努力让它工作,这让我发疯。 我希望有人能帮我解决这个问题。

您可以尝试使用 Document class 的方法。您使用 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

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

Now I need to iterate through all the documents in my collection, whose keynames are unknown, because they are generated in runtime, when a user enters some information.

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

我也对该解决方案感兴趣,因为我从未嵌套 key/value 对,看不到它的优势。是我错了还是让编程更难了?