Dictionary CouchDB:在Reduce函数中合并对象

Dictionary CouchDB:在Reduce函数中合并对象,dictionary,mapreduce,views,couchdb,reduce,Dictionary,Mapreduce,Views,Couchdb,Reduce,我是CouchDB的新手,所以请容忍我。我一直在寻找答案,但无法将范围缩小到这一点 我有一个映射器函数,可以为用户创建值。用户看到了不同的产品页面,我们希望统计他们看到的类型和产品 var emit_values = {}; emit_values.name = doc.name; ... emit_values.productsViewed = {}; emit_values.productsViewed[doc.product] = 1 emit([doc.id, doc.customer

我是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函数中,我希望为给定用户将不同的值收集到ProductsView对象中。因此,在减少之后,我有:

productsViewed: {
   book1: 1,
   book3: 2, 
   book8: 1
}
不幸的是,这样做会产生reduce溢出错误。根据其他帖子,这是因为ProductsView对象在reduce函数中的大小在增长,而Coach不喜欢这样

新CouchDB用户犯的一个常见错误是试图用reduce函数构造复杂的聚合值。完全缩减应该产生一个标量值,比如5,而不是一个包含一组唯一键和每个键的计数的JSON哈希


所以,我明白在沙发上这样做是不对的。有人知道如何在reduce之后正确地将值收集到文档中吗?

您可以简单地构建一个以客户为关键的视图

emit(doc.customer, doc.product);
然后你可以打电话

/:db/_design/:name/_view/:name?key=":customer"
获取用户已查看的所有产品

如果客户可以多次查看产品,则可以构建多键视图

emit([doc.customer, doc.product], null);
并使用内置函数
\u 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
}

我建议在客户文档上使用
\u update
处理程序。记录产品访问的每个请求都会向
customer.productsView
属性添加一个值,而不是创建一个新的文档

谢谢你的洞察力,拉贝尔。