2016-02-25 35 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

相關問題