为了账号安全,请及时绑定邮箱和手机立即绑定

从嵌入式文档数组 Mongodb Java 中获取字段的键

从嵌入式文档数组 Mongodb Java 中获取字段的键

叮当猫咪 2021-08-25 09:51:12
这是我的 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 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

就像您评论的那样,在您的代码中,您无法将 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);

}

我希望这对你有帮助。


查看完整回答
反对 回复 2021-08-25
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

感谢所有的答案,这是我的最终代码:


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]


查看完整回答
反对 回复 2021-08-25
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

我想我来晚了,但我正在尝试一种更 mongo 的方式来做到这一点。您肯定希望在一小部分查询上执行此操作,match甚至可能是开始此操作之前的一个阶段


db.coll.aggregate([{

            $unwind: '$config'

        }, {

            $project: {

                arr: {

                    $objectToArray: '$config'

                }

            }

        }, {

            $unwind: '$arr'

        }, {

            $group: {

                _id: {

                    key: '$arr.k'

                }

            }

        }, {

            $project: {

                key: '$_id.key',

                _id: 0

            }

        }

    ])


查看完整回答
反对 回复 2021-08-25
  • 3 回答
  • 0 关注
  • 204 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信