2014-09-18 121 views
1

我有文檔和視圖,您可以通過關鍵字列表進行搜索。文檔可能看起來像:按_id分組文檔,但允許按其他值搜索

{ 
    _id: "foo", 
    keywords: ["bar", "baz"], 
} 

然後,我的觀點:

map: function (doc) { 
    doc.keywords.forEach(function(word) {         
    emit(word, doc);            
    }); 
} 

這在偉大工程,我得到的foo文件回來,但問題是,如果我不提供關鍵我得到這個文件兩次是有道理的,因爲它有兩個關鍵字。但是,我只需要/需要一次文檔。

我還添加

reduce: function (key, value, rereduce) {        
    return value;             
} 

,但是這給了我reduce_overflow_error。如果我使用return null,那麼我爲文檔獲得的值是null,這也是不好的。

我也讀過關於使用列表函數,但我不知道列表函數應該在couchapp去。這似乎也相當複雜,我覺得應該相當簡單。

如何在查詢視圖時阻止重複進來?

回答

0

我發現你的查詢令人困惑,但讓我幫你解決一個錯誤。

在reduce函數中,您有多個值(即具有相同鍵的文檔數組)。因此,如果您按照以下方式重新編寫縮減函數,則會得到每個關鍵字只有一個文檔的關鍵字索引,但是縮小的文檔不會再鏈接到原始文檔。

function (key, values, rereduce){ 
    return values[0]; 
} 

如果你的使用情況是讓每個關鍵詞的文檔計數,你會寫:

function (key, values, rereduce){ 
    if (rereduce){ 
     var sum = 0; 
     for (i=0; i< values.length(); i++){ 
      sum = sum + values[i]; 
     } 
     return sum; 
    } 
    return values.length(); 
} 

在你想要的索引項指您對文檔進行任何情況下,包含關鍵,你不能使用減少功能。