使用couchDB map reduce创建标记列表

时间:2015-01-30 05:32:02

标签: couchdb couchdb-futon

我有一份文件清单(操作员),他们有设备。这些设备中的每一个都具有或更多标签。 我想为每个运营商创建一个唯一的标签列表。

算子1:  DEVICE1    TAG_1    TAG_2  设备2    TAG_1    tag_3

算子2:  DEVICE1    tag_4    TAG_2  设备2    TAG_1    tag_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]

2 个答案:

答案 0 :(得分:2)

您可以使用reduce函数来完成此任务:

function (keys, values, rereduce) {
  var tags = {};
  values.forEach(function(tag) {
    if (!tags[tag]) tags[tag] = true;
  });
  return Object.keys(tags).sort();
}

这将迭代values(即:“标签”)并返回它们的唯一列表。

一般来说,reduce函数应该具有非常小的输出,就像简单的数字一样。根据您的数据集的大小和多样性,您可能需要configure您的服务器以允许更大的减少输出。

答案 1 :(得分:0)

添加缩小功能。

function(keys, values) {
   return sum(values);
}

然后使用参数group = true进行查询。

相关问题