我在尝试获取类型集合以及在该doc类型中找到技能的次数时遇到了问题。
有许多文档类型都有技能列表。
{
"skills": "Windows, Network Admin, Linux",
"type": "Experience"
},
{
"skills": "Windows, Erlang, Linux",
"type": "Experience"
},
{
"skills": "Ruby, Rails, Erlang",
"type": "Project"
}
我正在尝试获取在文档类型中找到技能的次数。
最终结果应如下所示:
{
'type': Experience,
'skills': [
{'skill': 'Erlang', 'count': 1},
{'skill': 'Linux', 'count': 2},
{'skill': 'Network Admin', 'count': 1},
{'skill': 'Rails', 'count': 0},
{'skill': 'Ruby', 'count': 0},
{'skill': 'Windows', 'count': 2}
]
},
{
'type': Project,
'skills': [
{'skill': 'Erlang', 'count': 1},
{'skill': 'Linux', 'count': 0},
{'skill': 'Network Admin', 'count': 0},
{'skill': 'Rails', 'count': 1},
{'skill': 'Ruby', 'count': 1},
{'skill': 'Windows', 'count': 0}
]
}
最好的方法是什么?
答案 0 :(得分:1)
您应该将技能列表存储在文档中作为真实列表。
{
"skills": ["Windows", "Network Admin", Linux"],
"type": "Experience"
}
从那里,您的地图功能变为:
function(doc) {
for(var skill in doc.skills) {
emit([doc.type, skill], 1);
}
}
reduce函数只是对结果求和,所以使用“_sum”。您可以轻松选择仅显示具有开始和结束键的体验或项目。
答案 1 :(得分:0)
这是map和reduce函数(名为skill_split
的视图)和一个列表函数,它将产生的输出接近你使用像http://127.0.0.1:5984/myskills/_design/myskills/_list/transform/skill_split?group=true
这样的URL所要求的输出:
{
"Experience": {"Erlang":1, "Linux":2, "Network Admin":1, "Windows":2},
"Project":{"Erlang":1, "Rails":1, "Ruby":1}
}
我可以调整代码以使输出完全符合您的要求,但列表功能会更长一些。
<强>地图:
function(doc) {
if (doc.type && doc.skills) {
doc.skills.split(', ').forEach(function(skill) {
emit([doc.type, skill], 1);
});
}
}
<强>减少强>:
function(keys, values, rereduce) {
return sum(values)
}
或暂时使用"reduce": "_sum"
列表(名为transform
):
function(head, req) {
var results = {};
var row;
while (row = getRow()) {
var skill_map;
if (results.hasOwnProperty(row.key[0])) {
skill_map = results[row.key[0]];
} else {
skill_map = {};
results[row.key[0]] = skill_map;
}
if (skill_map.hasOwnProperty(row.key[1])) {
skill_map[row.key[1]] = skill_map[row.key[1]] + row.value;
} else {
skill_map[row.key[1]] = row.value;
}
}
send(JSON.stringify(results));
}
如果您无权访问JSON对象(您在CouchApp中进行访问),则可能需要跳过一些环节才能访问它。