如何从 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 对,看不到它的优势。是我错了还是让编程更难了?
我计划做的项目需要一些帮助。在这个阶段,我正在尝试学习在 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 对,看不到它的优势。是我错了还是让编程更难了?