如何解决如何从 MongoDB Java 中的多个嵌套文档中读取属性?
我需要一些关于我计划进行的项目的帮助。在这个阶段,我正在尝试学习在 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。如果这对您有任何帮助。
我现在正在努力让它工作好几天,这让我发疯。 我希望有人能够帮助我解决这个问题。
解决方法
这是一种您可以尝试使用 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 举报,一经查实,本站将立刻删除。