2015-06-18 113 views
0

我是CouchDB的新手,請耐心等待。我搜索了一個答案,但不能縮小到這個具體。CouchDB:合併對象以減少功能

我有一個爲用戶創建值的映射函數。用戶看到了不同的產品頁面,我們想要了解他們看到的類型和產品。

var emit_values = {}; 
emit_values.name = doc.name; 
... 
emit_values.productsViewed = {}; 
emit_values.productsViewed[doc.product] = 1 

emit([doc.id, doc.customer], emit_values); 

在reduce函數中,我想爲該給定用戶的productsViewed對象收集不同的值。所以減少後,我有這個:

productsViewed: { 
    book1: 1, 
    book3: 2, 
    book8: 1 
} 

不幸的是,這樣做會產生一個減少溢出錯誤。根據其他帖子,這是因爲productsViewed對象在reduce函數中的大小正在增長,並且Couch不喜歡這樣。 Specifically

新的CouchDB用戶犯的一個常見錯誤是試圖用reduce函數構造複雜的聚合值。完全減少應該產生一個標量值,如5,而不是例如帶有一組唯一鍵和每個鍵的計數的JSON散列。

所以,我明白這不是在沙發上做這件事的正確方法。有沒有人有任何洞察到如何正確收集減少後的文件的價值觀?

回答

0

您簡單與客戶建立關鍵

emit(doc.customer, doc.product); 

視圖,則可以調用

/:db/_design/:name/_view/:name?key=":customer" 

得到一個用戶查看所有產品。

如果客戶能看過產品幾次,你可以建立一個多鍵查看

emit([doc.customer, doc.product], null); 

,並內置功能降低它_count

/:db/_design/:name/_view/:name?startkey=[":customer","\u0000"]&endkey=[":customer","\u9999"]&reduce=true&group_level=2 

你必須接受你不能

構造複雜的總值

通過請求視圖與CouchDB。如果你想有一個數據結構,像你希望的有效載荷

productsViewed: { 
    book1: 1, 
    book3: 2, 
    book8: 1 
} 

我建議在客戶文檔使用_update處理程序。記錄產品訪問的每個請求都會爲customer.productsViewed屬性添加值,而不是創建新文檔。

+0

感謝您的洞察力,llabball。 – user2233394