使用couchDB map reduce创建标记列表
我有一个文档列表(操作员),他们有设备。每个设备都有一个或多个标签。 我想为每个操作员创建一个唯一的标记列表 操作员1: 设备1 标签1 标签2 设备2 标签1 标签3 操作员2: 设备1 标签4 标签2 设备2 标签1 标签3 我希望输出像这样使用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)执行此操作? 我能
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进行查询