我的java应用程序使用map-reduce从MongoDB集合中检索几个字符串<field's name, types>
。
例如,我有:
<_id,ObjectId>
<name, String,Object>
<dateOfBirth, String,Date>
这意味着在我的收藏集中有_id
字段只是ObjectId
,name
是String
或Object
和{{ 1}}可以是dateOfBirth
和String
。
现在,我的目标是找到字段出现的文档数。所以我写了这个java方法
Date
此方法正常工作:在输入中给出一个表示字段名称的字符串,它会找到字符串出现的文档数。 所以,对于每个领域我都有这样的东西:
public int countFields(String s) {
DBObject query = new BasicDBObject(s,new BasicDBObject("$exists",1));
int n = coll.find(query).count();
return n;
}
这意味着<_id, 500>
<name,340>
<dateOfBirth, 100>
出现在我的收藏集的500个文档中,{340}中的_id
和100中的name
假设我必须为集合的所有字段运行此方法:它效率不高!
例如,我的集合中有大约30k个文档,我为每个字段运行dateOfBirth
方法{{1并且它需要大约3秒来检索字段出现的文档数量。
我该怎么做才能在此查询中获得更好的性能?
答案 0 :(得分:1)
您可以执行简单的map-reduce来计算集合中的所有顶级字段:
db.coll.mapReduce(
function(){
for (var field in this) {
emit(field, 1);
}
},
function(field, times) {
return Array.sum(times);
}
)