Mongo查询以获取嵌套键值存在

时间:2016-12-13 18:58:51

标签: java mongodb performance find mongodb-query

我在我的一个系列中有文档,如下所示。

  {"id":"1", "properties":{"type1":{"items":[{"name":"A"},{"name":"B"}]}}}
    {"id":"2", "properties":{"type2":{"tasks":[{"name":"X"},{"name":"Y"}, {"name":"Z"}]}}}
    {"id":"3", "properties":{"type3":{"categories":[{"name":"A"},{"name":"P"}, {"name":"Q"}, {"name":"R"}]}}}
    {"id":"4", "properties":{"type4":{"list":[{"name":"D"},{"name":"B"}, {"name":"C"}, {"name":"A"}]}}}

我可以编写一个Mongo查找查询来列出包含" name":" A"的所有文档。 ?请让我有效地做到这一点。

我可以想到用所有可能的组合创建Criteria并将它们作为OR条件的可能性。但我不确定效率和性能。

使用动态密钥和嵌套组合获取此类文档列表的正确有效方法的任何线索都非常有用。

由于

2 个答案:

答案 0 :(得分:0)

由于嵌套的每一步都有不同的键名,因此没有直接的方法来检查包含“name”的文档:“A”。您必须为每个文档编写正确的步骤。与文档1一样,您必须编写

db.f1.find({"properties.type1.items.name":"A"})

然后只显示文档1.因此,要检查所有文档,您必须使用$ OR,就像我在此处用于文档1和文档3一样。

db.f1.find({$or:[{"properties.type1.items.name":"A"},{"properties.type3.categories.name":"A"}]})

答案 1 :(得分:0)

public static ArrayList<String> getKeys(Document it1) throws JSONException {
        ArrayList<String> result = new ArrayList<String>();
        ArrayList<String> resultTemp;
        String temp;
        Document doc;
        JSONArray jsa;

        int len, i;
        System.out.println(it1);
        String js = it1.toJson();
        JSONObject js1 = new JSONObject(js);

        Iterator<String> keys = js1.keys();
        while (keys.hasNext()) {
            String key = keys.next();
            if (key.equals("_id")) {
                result.add(key);
                continue;
            }
            System.out.println(key);

            temp = js1.get(key).toString();
            if (temp.contains(":")) {

                jsa = new JSONArray(temp);
                len = jsa.length();
                for (i = 0; i < len; i++) {
                    JSONObject object = jsa.getJSONObject(i);
                    doc = Document.parse(object.toString());
                    System.out.println(doc);
                    resultTemp = getKeys(doc);
                    for (String keyTemp : resultTemp) {
                        if (!result.contains(key + "." + keyTemp))
                            result.add(key + "." + keyTemp);
                    }
                }
            }

            else {
                result.add(key);
            }

        }

        return result;
    }