java - 使用 Java 检索 MongoDb 嵌套文档的所有键
问题描述
我有一个示例文档,例如:
{
"_id":{
"$oid":"5db183192bc7c53f24c6b1b4"
},
"name":"Jack",
"addresses":[
{
"type":1.0,
"street":"123 My Street",
"city":"Bedford Falls",
"state":"NJ"
},
{
"type":2.0,
"street":"456 My Street",
"city":"Bedford Falls",
"state":"NJ"
},
{
"type":3.0,
"street":"789 My Street",
"city":"Bedford Falls",
"state":"NJ"
}
]
}.
现在我想检索键的值(类型、街道、名称)。我怎样才能使用 Java 做到这一点?
我将键及其值添加到数组中,但在那之后没有。
package utils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.bson.BSONObject;
import org.bson.Document;
import org.bson.types.ObjectId;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
public class TestClass extends MongoConnector{
public static MongoClient mongoClient = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
TestClass demo =new TestClass();
mongoClient = demo.createConnection("*********", "******", "******", "*****", "*****");
DB databaseName =mongoClient.getDB("sampledata");
DBCollection coll = databaseName.getCollection("Mule");
String[] keyNames = {"name","type","street"};
ObjectId id= new ObjectId("4fce8cca5a37d2376c78017f");
BasicDBObject query = new BasicDBObject();
query.put("_id",id);
DBCursor cursor = coll.find();
ArrayList arr = new ArrayList();
String str;
while (cursor.hasNext()) {
System.out.println(cursor.next());
for (String key : keyNames) {
str=cursor.curr().get(key).toString();
arr.add(key+":"+str);
}
}
System.out.println(arr);
mongoClient.close();
}
}
我希望仅将值和键作为 List 获取,但是当给定类型时,它会引发空指针异常。任何人都可以帮忙吗
解决方案
里武,
您正在使用带有嵌套文档数组的文档。您需要获取“地址”,然后迭代该数组中存在的文档。
检查嵌入文档的 doc数组
DB databaseName =client.getDB("sampledata");
DBCollection coll = databaseName.getCollection("Mule");
String[] keyRootNames = {"name"};
ObjectId id= new ObjectId("4fce8cca5a37d2376c78017f");
BasicDBObject query = new BasicDBObject();
query.put("_id",id);
DBCursor cursor = coll.find();
ArrayList arr = new ArrayList();
String str;
while (cursor.hasNext()) {
System.out.println(cursor.next());
for (String key : keyRootNames) {
str=cursor.curr().get(key).toString();
arr.add(key+":"+str);
}
if(null != cursor.curr().get("addresses")){
BasicDBList addresses = (BasicDBList) cursor.curr().get("addresses");
for (int i = 0; i < addresses.size() ; i++){
BasicDBObject nestedDocument = (BasicDBObject) addresses.get(i);
arr.add(String.format("%s:%s", "type", nestedDocument.get("type")));
arr.add(String.format("%s:%s", "street", nestedDocument.get("street")));
}
}
}
System.out.println(arr);
推荐阅读
- css - 具有绝对位置溢出可滚动父级的 CSS 下拉菜单
- html - Mac 上的 Chrome:使用“位置:粘性”时滚动条消失
- matlab - 使用matlab解决线性有限差分问题
- reactjs - 如何将 Fab 置于循环进度中?
- python - 如何从.exe文件中恢复可读格式的python源代码文件?
- c# - 使用 System.Text.Json 反序列化匿名类型
- python - 在 lightkurve 中使用 Box Least Squares 时出错
- python - astype 是否编辑原始数据框?
- r - 数据类型转换导致 R 中的 NULL 值
- java - 有没有办法在 Java 中获取活动 Kubernetes Pod 的数量