使用couchDB map reduce创建标记列表

使用couchDB map reduce创建标记列表,couchdb,couchdb-futon,Couchdb,Couchdb Futon,我有一个文档列表(操作员),他们有设备。每个设备都有一个或多个标签。 我想为每个操作员创建一个唯一的标记列表 操作员1: 设备1 标签1 标签2 设备2 标签1 标签3 操作员2: 设备1 标签4 标签2 设备2 标签1 标签3 我希望输出像这样 Operator1 -> Tags: [tag_1,tag_2,tag_3] Operator2 -> Tags: [tag_1,tag_2,tag_3,tag_4] 如何使用视图(map reduce)执行此操作? 我能

我有一个文档列表(操作员),他们有设备。每个设备都有一个或多个标签。 我想为每个操作员创建一个唯一的标记列表

操作员1: 设备1 标签1 标签2 设备2 标签1 标签3

操作员2: 设备1 标签4 标签2 设备2 标签1 标签3

我希望输出像这样

    Operator1 -> Tags: [tag_1,tag_2,tag_3]
    Operator2 -> Tags: [tag_1,tag_2,tag_3,tag_4]
如何使用视图(map reduce)执行此操作? 我能够使用下面的映射器发出文档

    function(doc) {
        if (doc.key && doc.operator && doc.tags) {
            for (tag in doc.tags) {
              emit(doc.operator, tag.toLowerCase());
            }
         }
    }
这散发出

    Key           Value
    Operator1 - > tag_1
    Operator1 - > tag_2
    Operator1 - > tag_1
    Operator1 - > tag_3
    Operator2 - > tag_1
    Operator2 - > tag_2
    Operator2 - > tag_3
    Operator2 - > tag_4
我不知道如何将它们分组为:

    Operator1 -> Tags: [tag_1,tag_2,tag_3]
    Operator2 -> Tags: [tag_1,tag_2,tag_3,tag_4]

您可以使用reduce函数来完成以下操作:

function (keys, values, rereduce) {
  var tags = {};
  values.forEach(function(tag) {
    if (!tags[tag]) tags[tag] = true;
  });
  return Object.keys(tags).sort();
}
这将迭代
值(即:“标记”),并返回它们的唯一列表

一般来说,reduce函数应该有非常小的输出,比如简单的数字。根据数据集的大小和多样性,您可能需要对服务器进行修改以允许更大的reduce输出。

添加reduce函数

function(keys, values) {
   return sum(values);
}
然后使用参数group=true进行查询