我有一份文件清单(操作员),他们有设备。这些设备中的每一个都具有或更多标签。 我想为每个运营商创建一个唯一的标签列表。
算子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]
答案 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进行查询。