2015-06-18 98 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