首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >couchdb -集合分组问题

couchdb -集合分组问题
EN

Stack Overflow用户
提问于 2010-12-11 01:51:20
回答 2查看 349关注 0票数 0

我在尝试获取一个类型集合以及在该文档类型中发现技能的次数时遇到了问题。

有许多具有技能列表的文档类型。

代码语言:javascript
复制
{
   "skills": "Windows, Network Admin, Linux",
   "type": "Experience"
},
{
   "skills": "Windows, Erlang, Linux",
   "type": "Experience"
},

{
   "skills": "Ruby, Rails, Erlang",
   "type": "Project"
}

我正在尝试获取某个技能在文档类型中被发现的次数。

最终结果应该如下所示:

代码语言:javascript
复制
{
  '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}
  ]
}

做这件事最好的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-03 10:49:03

下面是map和reduce函数(视图名为skill_split)和一个list函数,它们将生成与您使用如下http://127.0.0.1:5984/myskills/_design/myskills/_list/transform/skill_split?group=true所要求的输出相近的输出

代码语言:javascript
复制
{
   "Experience": {"Erlang":1, "Linux":2, "Network Admin":1, "Windows":2},
   "Project":{"Erlang":1, "Rails":1, "Ruby":1}
}

我可以调整代码,使输出完全符合您的要求,但是list函数会更长一些。

地图

代码语言:javascript
复制
function(doc) {
  if (doc.type && doc.skills) {
    doc.skills.split(', ').forEach(function(skill) {
      emit([doc.type, skill], 1);
    });
  }
}

reduce

代码语言:javascript
复制
function(keys, values, rereduce) {
  return sum(values)
}

或者简称为"reduce": "_sum"

列表(命名为transform):

代码语言:javascript
复制
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中可以访问),那么您可能必须跳过一些障碍才能访问它。

票数 0
EN

Stack Overflow用户

发布于 2010-12-11 08:51:32

你应该在你的文档中以真实列表的形式存储技能列表。

代码语言:javascript
复制
{
   "skills": ["Windows", "Network Admin", Linux"],
   "type": "Experience"
}

从那时起,您的map函数将变为:

代码语言:javascript
复制
function(doc) {
  for(var skill in doc.skills) {
    emit([doc.type, skill], 1);
  }
}

而reduce函数只是对结果求和,所以使用"_sum“。您可以很容易地选择只显示经验或项目与开始和结束键。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4411774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档