【问题标题】:Mongo query to get nested key value presenceMongo查询以获取嵌套的键值存在
【发布时间】:2016-12-13 18:58:50
【问题描述】:

我的收藏中有如下所列的文档。

  {"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 条件的可能性。但我不确定效率和性能。

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

谢谢

【问题讨论】:

  • 我可以知道为什么这个问题是-1吗?这是无效的吗?

标签: java mongodb performance find mongodb-query


【解决方案1】:

由于每一步嵌套的键名不同,因此没有直接的方法来检查包含“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"}]})

【讨论】:

    【解决方案2】:
    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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      相关资源
      最近更新 更多