我正在尝试在CouchDB中创建一个视图,该视图返回一组唯一值。例如,所有独特品牌和类别的列表。
地图功能
function (doc) {
emit("brands", [doc.brand]);
emit("categories", [doc.category]);
}
减少功能
function (keys, values, rereduce) {
return values.reduce(function(acc, value) {
if (acc.indexOf(value[0]) === -1) {
return acc.concat(value);
}
return acc;
});
}
然后我用group=true
,group_level=2
调用该视图。分组是正确的,但是值不是唯一的。 value
是包含重复项的数组。
我想要实现的基本上是将key
作为组名,例如brands
,并将该值作为聚集的唯一值,例如["Brand A", "Brand B"]
。
给出以下文件
[
{
"_id": "1",
"brand": "Brand A",
"category": "Category A",
"colors": [
"Red",
"White"
]
},
{
"_id": "2",
"brand": "Brand B",
"category": "Category B",
"colors": [
"Blue",
"White"
]
},
{
"_id": "3",
"brand": "Brand A",
"category": "Category B",
"colors": [
"Green",
"Red"
]
}
]
当我查询然后在CouchDB中查看时,我想找回以下结果
{
"brands": ["Brand A", "Brand B"],
"categories": ["Category A", "Category B"],
"colors": ["Red", "White", "Blue", "Green"]
}
注:上面的结果只是我期望视图返回的演示。它不必具有这样的结构(甚至不能确定是否可能)。
我要亲自回答。
首先,我们要定义一个映射函数,该函数将组名作为键并将值包装在数组中(使rereduce
更容易。]]
地图功能
函数function (doc) { emit("brands", [doc.brand]); emit("categories", [doc.category]); doc.colors.forEach(function(color) { emit("colors", [color]); }) }
我们定义了自定义的reduce
function (keys, values, rereduce) { return values.reduce(function(acc, value) { value.forEach(function(v) { if (acc.indexOf(v) === -1) { return acc.push(v); } }); return acc; }); }
现在,使用
group=true
和group_level=1
调用视图将产生以下结果:
+ ------------ + ----------------------------------- +|关键价值|+ ------------ + ----------------------------------- +|品牌| [“品牌A”,“品牌B”] ||类别| [“类别A”,“类别B”] ||颜色| [“红色”,“白色”,“蓝色”,“绿色”] |+ ------------ + ----------------------------------- +