我的其中一个收藏中有文档,如下所示。
{"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 find查询来列出所有包含"name":"A“的文档吗?请告诉我做这件事的有效方法。
我可以想出一种可能性,用所有可能的组合创建标准,并将它们作为OR条件。但是我不确定它的效率和性能。
任何有关使用动态键和嵌套组合来获取此类文档列表的正确和有效方法的线索都将非常有帮助。
谢谢
发布于 2016-12-14 04:45:39
由于每个嵌套步骤的键名都不同,因此没有直接的方法来检查包含"name":"A“的文档。您必须为每个文档编写正确的步骤。就像文档1一样,你必须写下
db.f1.find({"properties.type1.items.name":"A"})然后,只有它会显示document 1。因此,要检查所有文档,必须使用$OR,就像我在这里对document 1和document 3使用的一样。
db.f1.find({$or:[{"properties.type1.items.name":"A"},{"properties.type3.categories.name":"A"}]})发布于 2019-01-11 17:32:13
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;
}https://stackoverflow.com/questions/41128591
复制相似问题