首页 > 解决方案 > 使用 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 获取,但是当给定类型时,它会引发空指针异常。任何人都可以帮忙吗

标签: javamongodb

解决方案


里武,

您正在使用带有嵌套文档数组的文档。您需要获取“地址”,然后迭代该数组中存在的文档。

检查嵌入文档的 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);

推荐阅读