2016-02-25 64 views
0

我的java应用程序使用map-reduce从MongoDB集合中检索几个字符串<field's name, types>
比如我有:出现字段的文档数量 - MongoDB

<_id,ObjectId> 
<name, String,Object> 
<dateOfBirth, String,Date> 

这意味着,在我的收藏有文件,其中_id场只是一个ObjectIdnameStringObjectdateOfBirth既可以是StringDate
现在,我的目标是查找出现字段的文档数量。所以我写了这个Java方法

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> 

这意味着_id出现在我收藏的500个文件,name在340和dateOfBirth在100

假设我有运行此方法适用于集合中的所有字段:效率不高!
例如,在我的收藏中有大约30k个文档,我对每个字段s运行countFields(s)方法,并且它需要大约3秒来检索出现字段的文档数量。
如何才能在此查询上获得更好的性能?

回答

1

你可以做一个简单的地图,减少计算集合中的所有顶级域:

db.coll.mapReduce(
    function(){ 
     for (var field in this) { 
      emit(field, 1); 
     }    
    }, 
    function(field, times) { 
     return Array.sum(times); 
    } 
) 
+0

好吧,你认为地图是降低复杂性方面更好? – DistribuzioneGaussiana

+0

我没有配置文件,但我会这样认为。另外,如果您不需要所有字段,则可以将其限制为特定列表。 –

+0

不幸的是我需要所有的字段,但我要测试map-redue。感谢您的建议。 – DistribuzioneGaussiana

相关问题