使用Java检索MongoDb嵌套文档的所有键
我有一个示例文档,如:使用Java检索MongoDb嵌套文档的所有键,java,mongodb,Java,Mongodb,我有一个示例文档,如: { "_id":{ "$oid":"5db183192bc7c53f24c6b1b4" }, "name":"Jack", "addresses":[ { "type":1.0, "street":"123 My Street", "city":"Bedford Falls", "state":"NJ" }, {
{
"_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();
}
}
我希望仅将值和键作为列表获取,但当给定类型时,它会抛出空指针异常。有人能帮忙吗
您正在使用嵌套文档数组的文档。您需要获取“地址”,然后在该数组中存在的文档中进行迭代
检查文件
DB databaseName=client.getDB(“sampledata”);
DBCollection coll=databaseName.getCollection(“Mule”);
字符串[]keyRootNames={“name”};
ObjectId=new ObjectId(“4fce8cca5a37d2376c78017f”);
BasicDBObject查询=新建BasicDBObject();
查询.放置(“\u id”,id);
DBCursor cursor=coll.find();
ArrayList arr=新的ArrayList();
字符串str;
while(cursor.hasNext()){
System.out.println(cursor.next());
for(字符串键:keyRootNames){
str=cursor.curr().get(key.toString();
arr.add(键+“:”+str);
}
if(null!=cursor.curr().get(“地址”)){
BasicDBList地址=(BasicDBList)cursor.curr().get(“地址”);
对于(int i=0;i
Rivu
您正在使用嵌套文档数组的文档。您需要获取“地址”,然后在该数组中存在的文档中进行迭代
检查文件
DB databaseName=client.getDB(“sampledata”);
DBCollection coll=databaseName.getCollection(“Mule”);
字符串[]keyRootNames={“name”};
ObjectId=new ObjectId(“4fce8cca5a37d2376c78017f”);
BasicDBObject查询=新建BasicDBObject();
查询.放置(“\u id”,id);
DBCursor cursor=coll.find();
ArrayList arr=新的ArrayList();
字符串str;
while(cursor.hasNext()){
System.out.println(cursor.next());
for(字符串键:keyRootNames){
str=cursor.curr().get(key.toString();
arr.add(键+“:”+str);
}
if(null!=cursor.curr().get(“地址”)){
BasicDBList地址=(BasicDBList)cursor.curr().get(“地址”);
对于(int i=0;i
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);