Как получить доступ к поддокументу поддокумента с помощью DBObject

Мне нужно получить список всех полей имени из следующего json. Я пытаюсь сделать это, сопоставив DBObject.

JSON:

{
    "firstOne": [
        {
            "file": "FileA",
            "Data": "One",
            "version": "0.4"
        }
    ],
    "secondOne": [
        {
            "elementName": "version",
            "complexElement": "true",
            "elementDataType": ""
        }
    ],
    "ThirdOne": [
        {
            "elementName": "version",
            "explicitElements": [
                {
                    "name": "mytag",
                    "type": "String",
                    "value": "myrequest"
                },
                {
                    "name": "booleantest",
                    "type": "Boolean",
                    "value": "true"
                }
            ]
        }
    ] }

КОД:

Коллекция DBCollection = mongoTemplate.getCollection("testTag");

  Map<DBObject, DBObject> map = new HashMap<DBObject, DBObject>();
  DBObject obj =null;

  BasicDBObject query = new BasicDBObject();
  query.put("ThirdOne.explicitElements.name", "myTag");
  BasicDBObject fields = new BasicDBObject();
  fields.put("ThirdOne.explicitElements.name", 1);
  fields.put("ThirdOne.explicitElements.value", 1);

  DBCursor cursor2 = collection.find(query, fields);      while

(cursor2.hasNext()) { obj = cursor2.next(); карта = obj.toMap();

      for (Map.Entry<DBObject, DBObject> entry : map.entrySet()) {
          System.out.println("Key : " + entry.getKey() + " Value : "
                  + entry.getValue());


      }
              }

ПОЛУЧЕННЫЕ РЕЗУЛЬТАТЫ:

ключ: _id значение: 523f910681a9535f8af5aa91

Ключ: значение ThirdOne: [{"explicitElements" : [{"name":"mytag", "value":"myrequest"},{"name":"booleantest", "value":"true"}]}]

Я хотел бы получить только

ключ: "имя" значение: "mytag"

ключ: "значение" значение: "myrequest" и т.д...

Любые предложения о том, как это сделать с помощью DBObjects?


person j v    schedule 12.09.2013    source источник
comment
Есть ли причина, по которой вы используете массивы только с одним объектом?   -  person Philipp    schedule 12.09.2013


Ответы (1)


Здесь у вас есть набор полей значений, хранящихся в DBObject, хранящихся в DBList, хранящихся в DBObject, хранящихся в DBList, хранящихся в DBObject, повторяемых DBCursor. Из-за этой запутанной структуры документа вам нужно пройти через все это дерево, когда вы хотите вывести только те, которые находятся на определенном его листе.

while (cursor2.hasNext()) {
     // you are now iterating a list objects with three Fields:
     // FirstOne, SecondOne and ThirdOne. You only want ThirdOne
     obj = cursor2.next();
     map = obj.toMap();
     DBList thirdOne = (DBList)map.get("ThirdOne");
     // now we iterat the list in ThirdOne
     for (Object o: thirdOne) {
           DBObject thirdOneEntry = (DBObject)o;     
           // we get the explicitElements-array from each entry    
           DBList explicitElements = (DBList)thirdOneEntry.get("explicitElements");
           // now we iterate the expliciteElements         
           for (Object o: explicitElements) { 
               DBObject explicitElementsEntry = (DBObject)o;
               // and write them
               Object key = explicitElementsEntry.get("key");
               Object value = explicitElementsEntry.get("value");
               System.out.println("Key : " + key.toString() + " Value : " value.toString());
           }
     }
}
person Philipp    schedule 12.09.2013
comment
Я попробовал код, я получаю сообщение об ошибке ниже при чистой установке maven. Ошибка находится в строке: for (DBObject ThirdOneEntry: ThirdOne). ОШИБКА: найдены несовместимые типы [ОШИБКА]: требуется java.lang.Object [ОШИБКА]: com.mongodb.DBObject - person j v; 12.09.2013
comment
Я обновил свой ответ. Это должно сработать, но я не могу проверить это прямо сейчас. - person Philipp; 12.09.2013
comment
Спасибо, это сработало. Мне просто нужно было изменить способ печати ключа/значения, потому что я получал нулевое исключение после печати первой пары ключ/значение. Вместо этого я использовал следующее: map2=explicitElementsEntry.toMap(); for (Map.Entry‹DBObject, DBObject› запись: map2.entrySet()) { System.out.println(Key: + entry.getKey() + Value: + entry.getValue()); } - person j v; 12.09.2013