Получить ключи полей из Embedded Array of Documents Mongodb Java - PullRequest
0 голосов
/ 31 августа 2018

Вот упрощенная схема моего документа MongoDB:

{
    "_id": 0,
    "config": [{
            "property1": "a",
            "property2": "b",
            "property3": "c",
            "property4": "d"
        },
        {
            "property1": "a",
            "property2": "bb",
            "property3": "cc",
            "property4": "d",
            "ispropert5": true
        },
        {
            "property1": "a",
            "property2": "b",
            "property3": "c",
            "property4": "ddd",
            "ispropert5": false,
            "ispropert6": false
        }
    ],
    "entity": "123asdf",
    "url": "",
    "createdDate": 1
}

В качестве вывода мне нужно получить список уникальных ключей вложенных документов: {property1, property2, property3, property4, ispropert5, ispropert6}

Я пытаюсь сделать это в своем классе, но, конечно, не смог привести ArrayList к Document:

 Document dbo = col.find().first();
        Set<String> keys = dbo.keySet();
        Iterator iterator = keys.iterator();

        while(iterator.hasNext()) {
            String key = iterator.next().toString();
            if(dbo.get(key) instanceof ArrayList){
                Document dboNested = (Document) dbo.get(key); //java.lang.ClassCastException: java.util.ArrayList cannot be cast to org.bson.Document
                Set<String> keysNested = dboNested.keySet();
                System.out.println("KeyNested: " + keysNested);
            }
        }

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

Полагаю, я опоздал, но я пытался сделать это более монго. Вы определенно захотите выполнить это для небольшого набора запросов, возможно, это этап match, прежде чем даже начинать этот

db.coll.aggregate([{
            $unwind: '$config'
        }, {
            $project: {
                arr: {
                    $objectToArray: '$config'
                }
            }
        }, {
            $unwind: '$arr'
        }, {
            $group: {
                _id: {
                    key: '$arr.k'
                }
            }
        }, {
            $project: {
                key: '$_id.key',
                _id: 0
            }
        }
    ])
0 голосов
/ 02 сентября 2018

спасибо за все ответы, вот мой окончательный код:

while (iterator.hasNext()) {
            String key = iterator.next().toString();
            Object value = dbo.get(key);
            if (value instanceof ArrayList) {
                ArrayList<?> dboArrayNested = (ArrayList<?>) value;
                for (Object dboNestedObj : dboArrayNested) {
                    Document dboNested = Document.class.cast(dboNestedObj);
                    if (dboNestedObj instanceof Document) {
                        keysNested.addAll(dboNested.keySet());
                    }
                }
                // else if extra...
            } else if (value instanceof Document) {
                Document dboNested = Document.class.cast(value);
                keysNested.addAll(dboNested.keySet());
            }
        }
        System.out.println("KeysNested: " + keysNested);

это выводит для данного примера: [property1, property2, property3, property4, ispropert5, ispropert6]

0 голосов
/ 31 августа 2018

Как вы прокомментировали, ваш код не может конвертировать ArrayList в Document, поэтому вы должны привести его к ArrayList, как показано ниже:

 while(iterator.hasNext()) {
    String key = iterator.next().toString();
    Object value = dbo.get(key);
    if (value instanceof ArrayList){
        ArrayList<?> dboArrayNested = (ArrayList<?>) value;
        for (Object dboNestedObj : dboArrayNested) {
            if (dboNestedObj instanceof Document) {
                printKeysNested(Document.class.cast(dboNestedObj));
            }
        }
    // else if extra...
    } else if (value instanceof Document) {
        printKeysNested(Document.class.cast(value));
    }
}

public static void printKeysNested(Document dboNested) {
    Set<String> keysNested = dboNested.keySet();
    System.out.println("KeyNested: " + keysNested);
}

Надеюсь, это вам поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...