在couchdb中对json对象进行map / reduce函数

时间:2013-06-11 01:18:55

标签: json mapreduce couchdb couchdb-futon

我的couchdb数据库中有几个文档,它们都是:

{
"_id":"1234567890",
"name": [
  "category1": 5,
  "category2": 8
]
}

我想要一个map函数,它给我“category1”作为键,5作为值。 我只是不能将“类别”和5分开。

我尝试了以下内容:

function(doc){
    if(doc.name){
        doc.name.forEach(function(sth) {
            emit(sth, null); 
        });
    }
}

也许有人可以帮我找到解决方案?

1 个答案:

答案 0 :(得分:2)

请注意:

  • CouchDB函数emit()有两个参数,第一个是密钥(例如"category1"),第二个是值(例如5)。请参阅CouchDB wiki中记录的view API
  • [key:val, ...]是不正确的JSON字段语法,您是指单个字段记录列表([{"key1": val1}, {"key2": val2}, ...])还是单个多字段记录({"key1": val1, "key2": val2, ...})?
  • 如果[{1}} "name": [{ "category1": 5}, {"category2": 8 }]延续的forEach参数为{"category1": 5},您应该以某种方式单独"category1"5 forEach()或再次for (var key in sth) {} ??)。
  • 如果是"name": { "category1": 5, "category2": 8 },请记住JS对象({"field": val, ...})没有forEach方法,数组([val1, val2, ...])原型。

假设您使用"name": { "category1": 5, "category2": 8 }作为名称,请考虑尝试以下map

function (data) {
  if (date.name) {
    for (var sth in name) {
      emit(sth, name[sth]);
    }
  }
}

如果您是JavaScript初学者,请先尝试在控制台中编写正确的代码。你可以使用网络浏览器中的一个(Firefox,Chrome有内置版本,我建议使用Firefox的FireBug插件)。祝你好运!