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

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

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

enter image description here

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

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

最后我需要在 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。如果这对您有任何帮助。

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

解决方法

这是一种您可以尝试使用 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
,

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

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

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

我对这个解决方案也很感兴趣,因为我从来没有嵌套过我的键/值对,也看不到它的优势。我错了还是它使编程变得更加困难?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?